拓扑排序模板

来源:互联网 发布:台风战斗机 知乎 编辑:程序博客网 时间:2024/05/26 05:53
#include <iostream>#include <cstdio>#include <cstring>#include <vector>#include <queue>using namespace std;const int MAXN=1100;vector<int>g[MAXN];int degree[MAXN];int ans[MAXN];bool toposort(int n){    memset(degree,0,sizeof(degree));    for(int i=0;i<n;i++)  // 下标从0~n-1    {        for(int j=0;j<g[i].size();j++)        {            degree[g[i][j]]++;        }    }    queue<int>q;    int tot=0,cnt=0;    for(int i=0;i<n;i++)    {        if(!degree[i])        {            q.push(i);            cnt++;        }    }    if(cnt != 1) return 0; // 这一行依情况而选择    while(q.size())    {        int qq=q.front();        q.pop();        ans[tot++]=qq; // ans记录顺序        for(int i=0;i<g[qq].size();i++)        {            degree[g[qq][i]]--;            if(degree[g[qq][i]]==0)                q.push(g[qq][i]);        }    }    if(tot==n) return 1;    return 0;}int main(){    int n,m;    while(scanf("%d%d",&n,&m)&&n)    {        int a,b;        memset(g,0,sizeof(g));        for(int i=0;i<m;i++)        {            scanf("%d%d",&a,&b);            g[a].push_back(b);        }        if(toposort(n))        {            for(int i = 0; i < n; i++)            {                printf("%d ", ans[i]);            }            printf("\n");        }        else            printf("ERROR!\n");    }    return 0;}
0 0
原创粉丝点击