博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3660 Cow Contest 传递闭包+Floyd
阅读量:6208 次
发布时间:2019-06-21

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

原题链接:http://poj.org/problem?id=3660

Cow Contest
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 8395   Accepted: 4734

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 ≤ NA ≠ 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 54 34 23 21 22 5

Sample Output

2

Source

题意

给你若干牛之间的优劣关系,问你有多少头牛能够被确定排名。

题解

如果有x头牛比当前牛弱,有y头牛比当前牛强,并且x+y=n-1,那么这头牛的排名就被唯一确定了。转化为图论问题,我们若牛a比牛b强,则连接a,b(单向)。运用floyd的思想,令dp[i][j]表示从i能够走到j,即牛i和牛j之间存在强弱关系,那么转移就是dp[i][j]=dp[i][j] | (dp[i][k] & dp[k][j]),跑一发floyd,再统计每个点的度即可。

代码

#include
#include
#include
#include
#include
#define MAX_N 111using namespace std;bool d[MAX_N][MAX_N];int n,m;void floyd() { for (int k = 1; k <= n; k++) for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) d[i][j] = d[i][j] | (d[i][k] & d[k][j]);}int de[MAX_N];int main() { cin.sync_with_stdio(false); cin >> n >> m; for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; d[u][v] = 1; } floyd(); int ans = 0; for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) de[i] += d[i][j], de[j] += d[i][j]; for (int i = 1; i <= n; i++)if (de[i] == n - 1)ans++; cout << ans << endl; return 0;}

 

转载于:https://www.cnblogs.com/HarryGuo2012/p/4759056.html

你可能感兴趣的文章
java处理高并发高负载类网站的优化方法
查看>>
SpringMVC调用过程
查看>>
memcached(十一)magent实现高可用
查看>>
关于一个类中方法调用情况
查看>>
使用Allure+testNG自动生成漂亮强大的测试用例报告
查看>>
C/C++求余运算符
查看>>
github地址
查看>>
[改善Java代码]警惕自增的陷阱
查看>>
[改善Java代码]不要随便设置随机种子
查看>>
解决FFmpeg丢失视频流及帧率过高的问题
查看>>
使用java实现MD5、BASE64、RSA的方法
查看>>
树莓派安装omv
查看>>
第六次作业(团队作业)
查看>>
JavaScript中的this陷阱的最全收集--没有之一
查看>>
java中的构造方法
查看>>
一道关于位数扩充的题目
查看>>
[GeekBand] STL vector 查找拷贝操作效率分析
查看>>
人类的终极目标是什么?
查看>>
使用Java语言开发微信公众平台(四)——图文消息的发送与响应
查看>>
Ansible 进阶技巧
查看>>