(Floyd算法的妙用)洛谷P2419 [USACO08JAN]牛大赛Cow Contest

一、算法分析

floyd算法可以将两个点之间的“到达”关系进行拓展。本题可以将两个奶牛间的确定的比较关系视作一种“到达”关系。然后再进行拓展。当一个点可以“到达”所有其它点的时候,就说明这个奶牛是与其它奶牛可比的,也就是说其是可以确定名次的。

二、代码与注释

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<map>
#include<cmath>
#define ll long long
using namespace std;
const int maxn=105;
int n,m;
int f[maxn][maxn];

int main(){ 
  
  cin>>n>>m;
  
  int x,y;
  for(int i=1;i<=n;i++) f[i][i]=1;//自己可以到自己 
  for(int i=0;i<m;i++){
  	cin>>x>>y;
  	f[x][y]=1;                    //表示从x可以“到”y 
	}
	for(int k=1;k<=n;k++)
	  for(int i=1;i<=n;i++)
	    for(int j=1;j<=n;j++){
	    	if(!f[i][j]){
	    		if(f[i][k] && f[k][j]) f[i][j]=1;
				}                         //将“到达”关系进行传递 
			}
	int sum=0;
	for(int i=1;i<=n;i++){
		int ok=1;
		for(int j=1;j<=n;j++){
			if(!f[i][j] && !f[j][i]){   //不可“到达”所有点,则不合题意,注意这里是双向的 
				ok=0;
				break;
			}
		}
		if(ok) sum++;
	}
	cout<<sum;
	return 0;
}

发布了50 篇原创文章 · 获赞 7 · 访问量 1121

猜你喜欢

转载自blog.csdn.net/numb_ac/article/details/103994268