题目链接:https://vjudge.net/problem/UVA-10305
解题思路:单向建边,将终点的入度加一。
当一个点入度为0时,这个点就可以被输出,同时这个点对应所有终点入度减一。
用bfs实现。
代码:
#include<cstdio>
#include<queue>
using namespace std;
const int N = 100*99/2 + 5;
struct node
{
int to,last;
}edge[N];
int head[105],id;
int in[105],ans[105];
void add(int u,int v){edge[id].to = v;edge[id].last = head[u];head[u] = id++;}
void bfs(int n)
{
int idx=0;
queue<int>que;
for (int i=1;i<=n;i++) if (!in[i]) que.push(i);
while (!que.empty()){
int now = que.front();que.pop();
for (int i = head[now];i!=0;i=edge[i].last){
int v = edge[i].to;
in[v]--;
if (!in[v]) que.push(v);
}
ans[idx++] = now;
}
for (int i=0;i<idx;i++)
if (!i) printf("%d",ans[0]);
else printf(" %d",ans[i]);
printf("\n");
}
int main()
{
int n,m;
while (~scanf("%d %d",&n,&m),(n||m)){
for (int i=1;i<=n;i++) in[i] = head[i] = 0;
id = 1;
while (m--){
int u,v;
scanf("%d %d",&u,&v);
in[v]++;
add(u,v);
}
bfs(n);
}
return 0;
}