POJ 3660 :http://poj.org/problem?id=3660
n为 100
这题起初没想出来,看了网上的人的想法。愧疚愧疚......
题目大意:n只牛,m场比赛。表示 牛A打败了牛B。
问:有几只牛的排名能够确定。
看了网上大家的解答,明白。一只牛的排名要想确定,必须知道 这只牛和 其他n-1只牛 的胜败关系。
而胜败关系是可以传递的。也就是说,牛A打败了牛B,牛B打败了牛C,那么牛A肯定打败牛C。
所以这题就是要求 n只牛之间的传递闭包。 然后统计有哪些牛 和别的n-1只牛皆有胜败关系。没那么这只牛的排名就确定了。
求传递闭包,用Floyd算法。 我还以为时间复杂度这么高的算法没什么用呢..........O__O "…
Floyd:
#include"cstdio"
#include"iostream"
#include"cstring"
#include"algorithm"
#include"vector"
#include"cmath"
#include"queue"
using namespace std;
#define INF 9999999
#define inf 109
#define loop(x,y,z) for(x=y;x<z;x++)
#define ll long long
int main()
{
int n,m;
int e[inf][inf];
int i,j,k;
int ans=0;
memset(e,0,sizeof e);
scanf("%d%d",&n,&m);
while(m--)
{
scanf("%d%d",&i,&j);
e[i][j]=1;
}
loop(k,1,n+1)
loop(i,1,n+1)
loop(j,1,n+1)
if(e[i][k]&&e[k][j])
e[i][j]=1;
loop(i,1,n+1)
{
int sum=0;
loop(j,1,n+1)
if(e[j][i])sum++;
loop(j,1,n+1)
if(e[i][j])sum++;
if(sum==n-1)ans++;
}
printf("%d\n",ans);
return 0;
}