博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Usaco2008 Jan
阅读量:5111 次
发布时间:2019-06-13

本文共 2249 字,大约阅读时间需要 7 分钟。

[Usaco2008 Jan]

题目描述

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.

FJ的N(1 <= N <= 100)头奶牛们最近参加了场程序设计竞赛:)。在赛场上,奶牛们按1..N依次编号。每头奶牛的编程能力不尽相同,并且没有哪两头奶牛的水平不相上下,也就是说,奶牛们的编程能力有明确的排名。 整个比赛被分成了若干轮,每一轮是两头指定编号的奶牛的对决。如果编号为A的奶牛的编程能力强于编号为B的奶牛(1 <= A <= N; 1 <= B <= N; A != B) ,那么她们的对决中,编号为A的奶牛总是能胜出。 FJ想知道奶牛们编程能力的具体排名,于是他找来了奶牛们所有 M(1 <= M <= 4,500)轮比赛的结果,希望你能根据这些信息,推断出尽可能多的奶牛的编程能力排名。比赛结果保证不会自相矛盾。

输入输出格式

输入格式:

 

第1行: 2个用空格隔开的整数:N 和 M

第2..M+1行: 每行为2个用空格隔开的整数A、B,描述了参加某一轮比赛的奶 牛的编号,以及结果(编号为A,即为每行的第一个数的奶牛为 胜者)

 

输出格式:

 

第1行: 输出1个整数,表示排名可以确定的奶牛的数目

 

输入输出样例

输入样例#1:
5 54 34 23 21 22 5
输出样例#1:
2

说明

输出说明:

编号为2的奶牛输给了编号为1、3、4的奶牛,也就是说她的水平比这3头奶

牛都差。而编号为5的奶牛又输在了她的手下,也就是说,她的水平比编号为5的

奶牛强一些。于是,编号为2的奶牛的排名必然为第4,编号为5的奶牛的水平必

然最差。其他3头奶牛的排名仍无法确定。

1 #include
2 using namespace std; 3 int g[105][105]; 4 int n,m; 5 int main() 6 { 7 int a,b; 8 cin>>n>>m; 9 for(int i=0;i
>a>>b;12 g[a][b]=1;13 }14 for(int k=1;k<=n;k++)15 for(int i=1;i<=n;i++)16 for(int j=1;j<=n;j++)17 {18 g[i][j]=g[i][j]||(g[i][k]&&g[k][j]);19 }20 int ans=0;21 for(int i=1;i<=n;i++)22 {23 int cnt=0;24 for(int j=1;j<=n;j++)25 if(g[i][j]||g[j][i])26 cnt++;27 if(cnt==n-1)28 ans++;29 }30 cout<
<

思路:

这道题目,可以看作图论,强弱关系可以看作一个有向图,用flyod处理出所有联通关系之后,一但某点可以确定强弱关系有n-1条,这个点的排名就可以被确定。

 

模板:

Floyd判断图是否联通

1 for(int k=1;k<=n;k++)2      for(int i=1;i<=n;i++)3         for(int j=1;j<=n;j++)4           g[i][j]=g[i][j]||(g[i][k]&&g[k][j]);

 

转载于:https://www.cnblogs.com/zuiaimiusi/p/10720516.html

你可能感兴趣的文章
s3c2440实验---定时器
查看>>
MyEclipse10安装SVN插件
查看>>
[转]: 视图和表的区别和联系
查看>>
Regular Experssion
查看>>
图论例题1——NOIP2015信息传递
查看>>
uCOS-II中的任务切换-图解多种任务调度时机与问题
查看>>
CocoaPods的安装和使用那些事(Xcode 7.2,iOS 9.2,Swift)
查看>>
Android 官方新手指导教程
查看>>
幸运转盘v1.0 【附视频】我的Android原创处女作,请支持!
查看>>
UseIIS
查看>>
集合体系
查看>>
vi命令提示:Terminal too wide
查看>>
引用 移植Linux到s3c2410上
查看>>
人与人之间的差距是从大学开始的
查看>>
MySQL5.7开多实例指导
查看>>
hdu 1029 Ignatius ans the Princess IV
查看>>
JAVA学习札记
查看>>
[UOJ] #78. 二分图最大匹配
查看>>
[51nod] 1199 Money out of Thin Air #线段树+DFS序
查看>>
poj1201 查分约束系统
查看>>