hdu1285确定比赛名次(拓扑排序kahn算法)

来源:互联网 发布:做淘宝后感想 编辑:程序博客网 时间:2024/04/29 14:18

用kahn算法实现拓扑排序。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1285

代码:

#include <iostream>#include <cstdio>#include <queue>#include <cstring>using namespace std;vector<int> arr[505];priority_queue<int,vector<int>, greater<int> > q;int in[505],ans[505];int main(){    int n,m;    while(~scanf("%d%d",&n,&m))    {        memset(in,0,sizeof(in));        for(int i = 0;i<m;i++)        {            int a,b;            scanf("%d%d",&a,&b);            arr[a].push_back(b);            in[b]++;        }        for(int i = 1;i<=n;i++)        {            if(in[i]==0)                q.push(i);        }        int cnt = 0;        while(!q.empty())        {            int now = q.top();            ans[cnt++] = now;            q.pop();            while(arr[now].size()>0)            {                int v = arr[now].back();                arr[now].pop_back();                in[v]--;                if(in[v]==0)                    q.push(v);            }        }        int flag = 0;        for(int i = 1;i<=n;i++)        {            if(arr[i].size()>0)            {                flag = 1;            }            arr[i].clear();        }        if(flag)            printf("Error\n");        else        {            for(int i = 0;i<cnt;i++)            {                if(i!=cnt-1)                    printf("%d ",ans[i]);                else                    printf("%d\n",ans[i]);            }        }    }    return 0;}

原创粉丝点击