题目81:确定比赛名次

来源:互联网 发布:viuvo无法访问移动网络 编辑:程序博客网 时间:2024/05/09 04:12
//http://ac.jobdu.com/problem.php?cid=1040&pid=80
#include <stdio.h>#include <vector>#include <queue>using namespace std;vector<int> edge[501];queue<int> Q;bool mark[501];          //标记已排序过的结点,因为多种情况下要保证顺序输出int main(){int n,m,i;int inDegree[501];while (scanf("%d%d",&n,&m)!=EOF){while (!Q.empty()){Q.pop();}for (i=1;i<=n;i++){           inDegree[i]=0;    mark[i]=false;   edge[i].clear();}while (m--){int a,b;scanf("%d%d",&a,&b);edge[a].push_back(b);inDegree[b]++;}for (i=1;i<=n;i++){int k=0;if (inDegree[i]==0){Q.push(i);        //第一个入度为0的点进队(保证号小者在队首)k++;if (k==1){break;}}}        int cnt=0;while (!Q.empty()){int nowP=Q.front();Q.pop();cnt++;mark[nowP]=true;if (cnt!=n){printf("%d ",nowP);}elseprintf("%d\n",nowP);for (i=0;i<edge[nowP].size();i++)  //vector[i][j]   j从0到vector[i].size-1   {inDegree[ edge[nowP][i] ]--;   //将当前结点的伙计结点入度--}for (i=1;i<=n;i++)         //为保证顺序,每次再从头找第一个入度为0结点{int k=0;if (mark[i]==true){continue;         //已排序的,跳过}if (inDegree[i]==0){Q.push(i);        //第一个入度为0的点进队(保证号小者在队首)k++;if (k==1){break;}}}}}return 0;}