USACO-2008-Cow Contest

来源:互联网 发布:windows高级选项菜单 编辑:程序博客网 时间:2024/06/07 08:25

Cow Contest(牛大赛)

题目来源:USACO

评测网站:https://www.luogu.org/problem/show?pid=2419

题目描述: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个整数,表示排名可以确定的奶牛的数目

输入样例:

5 54 34 23 21 22 5

输出样例:

2

思路:由于要确定一个奶牛的排名,就相当于要知道其他N-1只奶牛和该奶牛的排名关系,直接或者是间接。

例如样例中,所知的两只奶牛的排名分别就是2与5,可见,1、3、4三只奶牛都是直接胜过奶牛2,而且奶牛2胜过奶牛5,得知其排在第四位,而第五位就只能是奶牛5。当然,奶牛5的排名也可以由其单独分析的,由于只有奶牛2是直接胜过奶牛5的,但其余都是通过胜过2从而得知其必然胜过5。

将整个问题转化,就变成了求一个结点,到其他四个结点是否有一条路相连(注意题目之中给出的关系都是单向的,也就是有向图;而这里要求的是无向的,毕竟只要知道是否有关系就可以),如果都有,则计数器+1,最后输出总个数。

题解如下:

#include<bits/stdc++.h>using namespace std;int sum,n,m,i,j,k,yuanzhan[101][101],a,b;bool f;int main(){cin>>n>>m;for(i=1;i<=n;i++){for(j=1;j<=n;j++){yuanzhan[i][j]=1e9;}}for(i=1;i<=m;i++){cin>>a>>b;yuanzhan[a][b]=1;}for(k=1;k<=n;k++){for(i=1;i<=n;i++){for(j=1;j<=n;j++){yuanzhan[i][j]=min(yuanzhan[i][j],yuanzhan[i][k]+yuanzhan[k][j]);}}}for(i=1;i<=n;i++){f=0;for(j=1;j<=n;j++){if (i!=j){if (yuanzhan[i][j]==1e9 && yuanzhan[j][i]==1e9){f=1;break;}}}if (!f) sum++;}cout<<sum;return 0;}
Thanks for watching.

原创粉丝点击