D-Cow Contest
N(1≤N≤100)头奶牛,方便编号1。我们正在参加一个程序设计比赛。我们都知道,有些奶牛比其他奶牛的代码更好。每头牛都有一个固定的技能等级,这在竞争者中是独一无二的。
比赛分几轮进行,每轮由两头奶牛进行。如果奶牛A的技能水平高于奶牛B(1≤A≤N;1≤B≤N;A≠B),那么奶牛A总是打败奶牛B。
农民约翰正试图按技术水平给牛排序。给出一组M(1≤M≤4500)两轮奶牛轮数的结果,根据结果求出其等级的奶牛数。这些回合的结果将不会相互矛盾,这是可以保证的。
输入
第1行:两个用空格分隔的整数:N和M
第二到第M+1行:每一行包含两个空格分隔的整数,它们描述了竞争对手和一轮比赛的结果(第一个整数A是获胜者):A和B
输出
第1行:单个整数,表示可以确定的奶牛数量
Sample Input
5 5
4 3
4 2
3 2
1 2
2 5
Sample Output
2
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int map[105][105], inf = 0x3f3f3f3f;
int main()
{
int n, m;
scanf("%d%d", &n, &m);
memset(map, inf, sizeof(map));
int x, y;
for( int i = 0; i < m; i++ )
{
scanf("%d%d", &x, &y);
map[x][y] = 1;
map[y][x] = -1;
}
for( int j = 1; j <= n; j++ )
for( int i = 1; i <= n; i++ )
for( int k = 1; k <= n; k++ )
{
if( map[i][j] == map[j][k] && ( map[i][j] == 1 || map[i][j] == -1 ) )
map[i][k] = map[i][j];
}
int ans = 0;
for( int i = 1; i <= n; i++ )
{
int sum = 0;
for( int j = 1; j <= n; j++ )
{
if( map[i][j] != inf )
sum++;
}
if( sum == n - 1 )
ans++;
}
printf("%d", ans);
return 0;
}
- 一头牛的等级,当且仅当它与其它N-1头牛的关系确定时确定
- 于是我们可以将牛的等级关系看做一张图
- 然后进行适当的松弛操作,得到任意两点的关系
- 再对没一头牛进行检查