http://acm.hdu.edu.cn/showproblem.php?pid=1285
拓扑排序
先讲拓扑排序的算法
1)找一个没有前驱的结点
2)将其输出
3)该从该结点发出的每条边的终点结点入度减1
4)重复1,直至所有结点添加完毕
此题有重边,会影响入度的计算
#include <stdio.h>
int team[505][505];
int degree[505];
int N,M;
int main()
{
while(scanf("%d%d",&N,&M)!=EOF){
int i,j;
for(i=1;i<=N;i++){
degree[i]=0;
for(j=1;j<=N;j++)
team[i][j]=0;
}
for(i=1;i<=M;i++){
int p1,p2;
scanf("%d%d",&p1,&p2);
if(!team[p1][p2])
degree[p2]++;
team[p1][p2]=1;
}
int count;
for(count=1;count<=N;count++){
for(i=1;i<=N;i++){
if(degree[i]==0){
degree[i]=-1;
for(j=1;j<=N;j++){
if(team[i][j]&°ree>0)
degree[j]--;
}
printf("%d",i);
if(count==N) putchar('\n');
else putchar(' ');
break;
}
}
}
}
}