HDU-1285-确定比赛名次

来源:互联网 发布:卡雷尔机器人编程 编辑:程序博客网 时间:2024/05/17 03:30

HDU-1285-确定比赛名次

http://acm.hdu.edu.cn/showproblem.php?pid=1285

拓扑排序

1.在有向图中选一个没有前驱的点并输出

2.从图中删除该顶点和所有与它相关的边

3.重复上述两个步骤,直到全部顶点均已输出,或者当前图中不存在无前驱的顶点,后一种情况则说明有向图中存在环

#include<stdio.h>#include<string.h>#include<stdlib.h>int a[600];//标记入度int flag[600];//该点是否被访问过int map[600][600];int n,m;int main(){int p1,p2,t;int i,j,k;while(scanf("%d%d",&n,&m)!=EOF){memset(a,0,sizeof(a));memset(map,0,sizeof(map));memset(flag,0,sizeof(flag));while(m--){scanf("%d%d",&p1,&p2);if(map[p1][p2]==0)  //防止有重边{a[p2]++;map[p1][p2]=1;}}if(n==1){printf("1\n");continue;}t=1;for(k=1;k<=n;k++){for(i=1;i<=n;i++){if(a[i]==0&&flag[i]==0){flag[i]=1;if(t==1){printf("%d",i);t=0;}elseprintf(" %d",i);for(j=1;j<=n;j++)if(map[i][j]==1&&flag[j]==0)a[j]--;break;}}}printf("\n");}return 0;}