题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1285
题目大意:某人知道N个队伍M场比赛的胜负结果,要求输出N个队伍的名次(id为第二关键字)。
核心思想:转化为图论问题,进行拓扑排序。步骤1.选定入度为0的点 2.删除该点与关联边 3.重复该过程
代码如下:
//拓扑排序 (1.选入度为0的点。2.删除该点及关联边 3.重复该过程) #include <iostream> #include <memory.h> using namespace std; int MAP[510][510];//MAP[0][i]为第i个点的入度 int M,N; void clear(int n){ //删除关联边 for(int i=1;i<=N;i++){ if(MAP[n][i]==1){ MAP[n][i]=0; MAP[0][i]--; } } return; } void solve(){ int target; int cnt=0; bool flag=false; for(int i=1;i<=N;i++){ if(MAP[0][i]==0){ cnt++; cout<<i; clear(i); MAP[0][i]--; i=0;//很关键, if(cnt==N)cout<<endl; else cout<<" "; } } return ; } int main(){ int x,y,cnt=0; while(cin>>N>>M){ memset(MAP,0,sizeof(MAP)); while(M--){ cin>>x>>y; if(!MAP[x][y]){ MAP[x][y]=1; MAP[0][y]++; } } for(int i=1;i<=N;i++){ if(MAP[0][i]==0)cnt++; } if(cnt==0)MAP[0][1]=0;//如果是环要这样处理,1为起点 solve(); } return 0; }