题目大概:
输入有多个数据,输入n,m,接下来有n个队伍参加了m场比赛,接下来m行每行两个数p1,p2,是p1赢了p2,p1要排在p2前面,输出排名(不唯一)。
思路:
因为这个题中是无环有向图,所有可以用拓扑排序。
拓扑排序可以定义一个map来记录那两个队有比赛谁赢了,map【a】【b】=1;代表a赢了b。
还可以有入度记录r【】,记录入度个数。
出度个数c【】。
所有数据存入后,每次输出入度为0的队伍,然后把它与其他队伍的联系解除。
不断循环就可以了。
感想:
自己学一个算法就是比较麻烦,看了白皮书,还不够,还需要从网上学习。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF=505;
int map[INF][INF];
int r[INF];
int c[INF];
int main()
{
int n,m;
while(cin>>n>>m)
{
memset(map,0,sizeof(map));
memset(r,0,sizeof(r));
memset(c,0,sizeof(c));
int fr,to;
for(int i=1;i<=m;i++)
{
cin>>fr>>to;
if(map[fr][to]==0)
{
map[fr][to]=1;
c[fr]++;
r[to]++;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(r[j]==0)
{
r[j]--;
if(i!=n)
cout<<j<<" ";
else cout<<j<<endl;
for(int k=1;k<=n;k++)
{
if(map[j][k])r[k]--;
}
break;
}
}
}
return 0;
}