HDOJ 1285 确定比赛名次
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; } } } } }