拓扑排序模板

#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;
}

你可能感兴趣的:(拓扑排序模板)