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