确定比赛名次(拓扑排序)

来源:互联网 发布:外汇软件 编辑:程序博客网 时间:2024/06/15 02:17

题目大概:

输入有多个数据,输入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;}