确定比赛名次,算很简单的拓扑排序了。领接矩阵表示。
#include<iostream> using namespace std; int map[501][501]; int degree[501]; int main() { int i,j,k; int n,m,p1,p2; bool f; while(cin>>n>>m) { memset(map,0,sizeof(map)); memset(degree,0,sizeof(degree)); for(i=1;i<=m;i++) { cin>>p1>>p2; if(!map[p1][p2]) //判断重边,否则会出错 { map[p1][p2]=1; degree[p2]++; } } f=0; //拓扑排序 for(i=1;i<=n;i++) //进行n次处理以便处理完所有点 { for(j=1;j<=n;j++) //找到度为0的点 { if(degree[j]==0) { degree[j]--; //对应度数递减,避免下次再处理 if(f==0) { cout<<j; f=1; } else cout<<" "<<j; for(k=1;k<=n;k++) //去除和度数为0的点相连的边,即读书减一 if(map[j][k]==1) degree[k]--; break; } } } cout<<endl; } return 0; }
时间: 2024-12-21 17:16:41