洛谷 P2419 [USACO08JAN]Cow Contest S(传递闭包,Floyd)

传送门


解题思路

传递闭包板子题。

直接建边然后Floyd即可。

最后对于每一个点,若比他小的(ma[i][j])加上比他大的(ma[j][i])等于n-1,则他可以确定排名。

AC代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int n,m,ma[105][105],ans;
int main(){
	ios::sync_with_stdio(false);
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		ma[u][v]=1;
	}
	for(int i=1;i<=n;i++) ma[i][i]=1;
	for(int k=1;k<=n;k++){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				ma[i][j]|=ma[i][k]&ma[k][j];
			}
		}
	}
	for(int i=1;i<=n;i++){
		int res=0;
		for(int j=1;j<=n;j++){
			res+=ma[i][j]+ma[j][i];
		}
		if(res-2==n-1) ans++;
	}
	cout<<ans;
	return 0;
}
原文地址:https://www.cnblogs.com/yinyuqin/p/15344123.html