#include<stdio.h> #include<string.h> #include<stdlib.h> int indegree[505],map[505][505];//indegree记录每个节点的入度和。map记录那些边是相关联的 int tp[505],k;//记录拓扑序列。 void topsort(int n) { int i,j,v; k=0; memset(tp,0,sizeof(tp)); for(i=1;i<=n;i++)//找n次,每次找到了,就又重头开始找。 { for(j=1;j<=n;j++)//寻找入度为0的节点。 { if(indegree[j]==0) { indegree[j]=-1;//找到后就除去,否则下次就又会找这个 tp[k++]=j;//记录拓扑序列中 for(v=1;v<=n;v++)//把该节点相关的弧都删除。 { if(map[j][v]) indegree[v]--; } break;//找到就退出循环。重头开始找。 } } } } int main() { int n,m,p1,p2,i,j; while(scanf("%d%d",&n,&m)!=EOF) { memset(indegree,0,sizeof(indegree)); memset(map,0,sizeof(map)); for(i=0;i<m;i++) { scanf("%d%d",&p1,&p2); if(map[p1][p2]==0) { map[p1][p2]=1; indegree[p2]++; } } topsort(n); for(i=0;i<k-1;i++) { printf("%d ",tp[i]); } printf("%d\n",tp[k-1]); } return 0; }
hdu 1285 确定比赛名次,布布扣,bubuko.com
原文地址:http://www.cnblogs.com/duan-to-success/p/3851558.html