HDU 1285 确定比赛名次【拓扑排序】
题意:中文的题目-----这道题让我终于明白了那个break的作用---因为题目中有这一句“符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前”@_@
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int map[505][505],indegree[505],queue[505]; int main() { int n,m,i,j,k,a,b,iq; while(scanf("%d %d",&n,&m)!=EOF&&n&&m) { memset(map,0,sizeof(map)); memset(indegree,0,sizeof(indegree)); for(i=1;i<=m;i++) { scanf("%d %d",&a,&b); if(!map[a][b]) { map[a][b]=1; indegree[b]++; } } iq=0; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(indegree[j]==0) { indegree[j]--; queue[iq++]=j; break; //每次只扫一次,这样保证了题目中说的"符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前" } } for(k=1;k<=n;k++) { if(map[j][k]) indegree[k]--; } } for(i=0;i<iq-1;i++) printf("%d ",queue[i]); printf("%d\n",queue[i]); } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。