zoukankan      html  css  js  c++  java
  • [模板] 拓扑排序

    输出一条路径

    #include<iostream>
    #include<stack>
    #include<cstring>
    #define MAXN 200000
    using namespace std;
    
    int m,n; 
    int in[MAXN];
    
    struct Edge{
        int next,to;
    }e[MAXN];
    int ecnt,head[MAXN];
    inline void add(int x,int y){
        e[++ecnt].to = y;
        e[ecnt].next = head[x];
        head[x]=ecnt;
    }
    
    void oper(int x){
        cout<<x<<" ";
    }
    void topo(){
        stack<int> S;
        for(int i=1;i<=n;i++) if(in[i]==0) S.push(i);
        while(!S.empty()){
            int top=S.top() ;S.pop();
            oper(top);
            for(int i=head[top];i!=-1;i=e[i].next){
                int v=e[i].to ;
                in[v]--;
                if(in[v]==0) S.push(v); 
            }
        } 
    }
    
    int main(){
        memset(head,-1,sizeof(head));
        cin>>n>>m;
        int x,y;
        for(int i=1;i<=m;i++){
            cin>>x>>y;
            add(x,y);
            in[y]++;
        }
        topo();
        return 0;
    }

    输出所有路径 dfs实现

    #include<iostream>
    #include<cstring>
    #define MAXN 200000
    using namespace std;
    
    int m,n;
    int ans[MAXN],cnt;
    
    int in[MAXN];
    struct Edge{
        int to,next;
    }e[MAXN];
    int ecnt,head[MAXN];
    inline void add(int x,int y){
        e[++ecnt].to = y;
        e[ecnt].next = head[x];
        head[x]=ecnt;
    }
    
    
    inline void print(){
        for(int i=1;i<=n;i++) cout<<ans[i]<<" ";
        cout<<endl;
    //  cnt++;
    }
    
    bool vis[MAXN];
    void dfs(int dp){
        if(dp==n+1){
            print();
            return;
        }
        for(int i=1;i<=n;i++){
            if(!vis[i]&&in[i]==0){
                for(int j=head[i];j!=-1;j=e[j].next){
                    in[e[j].to]--;
                }
                vis[i]=1;
                ans[dp]=i;
                dfs(dp+1);
                for(int j=head[i];j!=-1;j=e[j].next){
                    in[e[j].to]++;
                }
                vis[i]=0;
            }
        }
    
    }
    
    int main(){
        memset(head,-1,sizeof(head));
        cin>>n>>m;
        int x,y;
        for(int i=1;i<=m;i++){
            cin>>x>>y;
            add(x,y);
            in[y]++;
        }
        dfs(1);
        cout<<cnt<<endl;
        return 0;
    }

    本文来自博客园,作者:GhostCai,转载请注明原文链接:https://www.cnblogs.com/ghostcai/p/9247516.html

  • 相关阅读:
    为什么Android的图片质量会比iPhone的差?
    第二次作业-编程
    印像最深的三位老师
    c++的类型转换(转)
    SpringMVC入门详解
    java基础
    springmvc
    Maven配置下载包速度更快
    spring中的bean.xml
    pom.xml依赖
  • 原文地址:https://www.cnblogs.com/ghostcai/p/9247516.html
Copyright © 2011-2022 走看看