您的位置:首页 > 其它

Cow Contest(Poj 3660)

2017-01-15 12:31 281 查看

Description

N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in

a programming contest. As we all know, some cows code better than

others. Each cow has a certain constant skill rating that is unique

among the competitors.

The contest is conducted in several head-to-head rounds, each between

two cows. If cow A has a greater skill level than cow B (1 ≤ A ≤ N; 1

≤ B ≤ N; A ≠ B), then cow A will always beat cow B.

Farmer John is trying to rank the cows by skill level. Given a list

the results of M (1 ≤ M ≤ 4,500) two-cow rounds, determine the number

of cows whose ranks can be precisely determined from the results. It

is guaranteed that the results of the rounds will not be

contradictory.

Input

Line 1: Two space-separated integers: N and M

Lines 2..M+1: Each line contains two space-separated integers that describe the competitors and results (the first integer, A, is the

winner) of a single round of competition: A and B

Output

Line 1: A single integer representing the number of cows whose ranks can be determined

Sample Input

5 5
4 3
4 2
3 2
1 2
2 5


Sample Output

2


Source

USACO 2008 January Silver

传递闭包,利用floyd-warshall算法解决

//============================================================================
// Name        : test.cpp
// Author      : Qihan
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
using namespace std;
typedef long long int LLI;
typedef pair<LLI,LLI> PII;
#define Lowbit(x) (x & (-x))
const int inf = 1000000000;
const int maxn = (2048 + 10);

bool vis[maxn][maxn];

int main() {
//    freopen("/home/qihan/Documents/in","r",stdin);
int n,m;
memset(vis,false,sizeof(vis));
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; i ++) {
vis[i][i] = true;
}
for(int i = 1; i <= m; i ++) {
int x,y;
scanf("%d%d",&x,&y);
vis[x][y] = true;
}
for(int k = 1; k <= n; k ++) {
for(int i = 1; i <= n; i ++) {
for(int j = 1; j <= n; j ++) {
if(vis[i][k] == true && vis[k][j] == true)
vis[i][j] = true;
}
}
}
int ans = 0;
for(int i = 1; i <= n; i ++) {
bool flag = true;
for(int j = 1; j <= n; j ++) {
if(i == j)  continue;
else if(!vis[i][j] && !vis[j][i]) {
flag = false;
break;
}
}
if(flag == true)    ans ++;
}
printf("%d\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  传递闭包 floyd