确定比赛名次,算很简单的拓扑排序了。领接矩阵表示。
#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;
}
原文地址:http://blog.csdn.net/a809146548/article/details/44282357