当前位置: 代码迷 >> 综合 >> Cow Contest (Floyd算法)
  详细解决方案

Cow Contest (Floyd算法)

热度:18   发布时间:2023-12-05 02:27:56.0

题目:FJ的N(1 <= N <= 100)头奶牛们最近参加了场程序设计竞赛:)。在赛场上,奶牛们按1..N依次编号。每头奶牛的编程能力不尽相同,并且没有哪两头奶牛的水平不相上下,也就是说,奶牛们的编程能力有明确的排名。 整个比赛被分成了若干轮,每一轮是两头指定编号的奶牛的对决。如果编号为A的奶牛的编程能力强于编号为B的奶牛(1 <= A <= N; 1 <= B <= N; A != B) ,那么她们的对决中,编号为A的奶牛总是能胜出。 FJ想知道奶牛们编程能力的具体排名,于是他找来了奶牛们所有 M(1 <= M <= 4,500)轮比赛的结果,希望你能根据这些信息,推断出尽可能多的奶牛的编程能力排名。比赛结果保证不会自相矛盾。

思路:对于每个奶牛,将其假设为一个点,假如所有点与它的关系都确定了,那么它的排名也就确定了。什么意思呢?就是,比如1、2可以到3,3可以到4、5,那么无论前面的1、2,还是后面的4、5的排位改变都不关3的事,3始终是排第三,(1-2-3-5-4或者2-1-3-4-5)。所以,我们可以把这题奶牛看成是地图上的n个点,f[i][j]表示第i个点可以到达第j个点,f[i][j]=f[i][k]&&f[k][i]表示为第i个点可以通过第k个点到达第j个点。这就是floyd算法的变形。

代码

#include<bits/stdc++.h>
using namespace std;
int f[105][105],n,m;
int main()
{scanf("%d %d",&n,&m);for(int i=1;i<=m;i++){int a,b;scanf("%d %d",&a,&b);f[a][b]=1;}for(int k=1;k<=n;k++){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){f[i][j]=f[i][j]||(f[i][k]&&f[k][j]);//只要有一个为true就代表可以到达}}}int sum=0;for(int i=1;i<=n;i++){int ans=1;for(int j=1;j<=n;j++){if(i==j) continue;else{ans=ans&(f[i][j]||f[j][i]);//只要所有点到其中一个点的关系确定就可以确定它的排名}}sum+=ans;}printf("%d",sum);
}

  相关解决方案