小白+拓扑排序的模板

来源:互联网 发布:python sha1 函数 编辑:程序博客网 时间:2024/06/14 05:28
///拓扑排序,#include<stdio.h>#include<stdlib.h>#include<iostream>#include<string.h>#include<cstring>#include<string>#include<math.h>#include<algorithm>#include<vector>#define LL long long#define INF 0x3f3f3f3f#define mod 1000000007const int maxn=1e5+5;using namespace std;///c[u]=0表示从未访问过///c[u]=1 表示已经访问过,并且还递归访问过它的所有子孙(即dfs(u)曾被调用过,并已返回///c[u]=-1 表示正在访问vector<int>G[maxn];int c[maxn];int topo[maxn],t=0,n=0,m=0;bool dfs(int u){    c[u]=-1;    int d=G[u].size(),v=0;    for(int i=0;i<d;i++){        v=G[u][i];        if(c[v]<0) return false;///存在有项环,失败退出。        else if(!c[v]&&!dfs(v)) return false;    }    c[u]=1;topo[t--]=u;///放拓扑的序列    return true;}bool toposort(){    t=n;    memset(c,0,sizeof(c));    for(int u=1;u<=n;u++){///节点从1开始        if(!c[u]){            if(!dfs(u)) return false;        }    }    return true;}int main(){    int a=0,b=0;    scanf("%d%d",&n,&m);    while(m--){        scanf("%d%d",&a,&b);        G[a].push_back(b);    }    toposort();    for(int i=1;i<=n;i++){        printf("%d\n",topo[i]);    }    return 0;}

0 0
原创粉丝点击