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

题目大概:

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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值