poj 3660(Floyd求传递闭包)
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 9317 | Accepted: 5249 |
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
题意:有n头牛比赛,m种比赛结果,最后问你一共有多少头牛的排名被确定了,其中如果a战胜b,b战胜c,则也可以说a战胜c,即可以传递胜负。求能确定排名的牛的数目。
解题思路:如果一头牛被x头牛打败,打败y头牛,且x+y=n-1,则我们容易知道这头牛的排名就被确定了,所以我们只要将任何两头牛的胜负关系确定了,在遍历所有牛判断一下是否满足x+y=n-1,将满足这个条件的牛数目加起来就是所求解。
可以利用传递闭包,将某头牛到其它牛的"可达性"求出。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;const int maxn = 105;
int n,m,map[maxn][maxn];void floyd()
{for(int k = 1; k <= n; k++)for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++)map[i][j] = map[i][j] || (map[i][k] && map[k][j]);
}int main()
{int u,v;while(scanf("%d%d",&n,&m)!=EOF){memset(map,0,sizeof(map));for(int i = 1; i <= m; i++){scanf("%d%d",&u,&v);map[u][v] = 1;}floyd();int ans = 0,tmp;for(int i = 1; i <= n; i++){tmp = 0;for(int j = 1; j <= n; j++)if(i != j && (map[i][j] || map[j][i]))tmp++;if(tmp == n-1) ans++;}printf("%d\n",ans);}return 0;
}
poj 3660(Floyd求传递闭包)相关推荐
- UVA - 247 Calling Circles(Floyd求传递闭包)
题目: 思路: 利用Floyd求传递闭包(mp[i][j] = mp[i][j]||(mp[i][k]&&mp[k][j]);),当mp[i][j]=1&&mp[j][ ...
- poj 3660 Cow Contest 传递闭包
题目链接: http://poj.org/problem?id=3660 题目大意: 有n头牛,每头牛都有一个战斗值,农夫约翰想给这些牛排名次,但是只有m场比赛,约翰想知道有多少头牛的名次是确定的. ...
- Floyd求传递闭包
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1704 题意:给出一些排名,求最少需要询问多少次才能确定总体排名.本题属于求传递闭包问题,用Floyd算法即 ...
- The Geodetic Set Problem - POJ 1612 Floyd求最短路径所有点集
题目链接 POJ 1612 Description Let G = (V,E) be a connected graph without loops and multiple edges, where ...
- POJ 3660 Cow Contest 传递闭包+Floyd
原题链接:http://poj.org/problem?id=3660 Cow Contest Time Limit: 1000MS Memory Limit: 65536K Total Subm ...
- POJ 3615 floyd 求任意起点终点的最短路
http://poj.org/problem?id=3615 题意:求起点到终点的最短路,不存在则输出-1.这题居然tle两次,把floyd放在外面就行了. View Code // I'm lanj ...
- poj 3660 CwoContest Floyed传递闭包
https://www.luogu.org/problem/P2419 题意: 有N头牛,每个牛有一个唯一且不同的能力等级值.然后他们中的两头牛进行M场比赛,并给你这M场的比赛结果.现在的问题是问你有 ...
- Poj(2240),Floyd求汇率是不是赚钱
题目链接:http://poj.org/problem?id=2240. Floyd算法修改一下,我要最大路径(通过转汇率变到最大)改成max. #include <iostream> # ...
- POJ2594(二分匹配+Floyd求传递闭包)
题目:Treasure Exploration 很明显是最小路径覆盖,只是必须先要求传递闭包就行了. #include <stdio.h> #include <string.h> ...
最新文章
- 软件项目技术方案_榆林化学公司项目工艺包关键技术创新方案审查顺利完成
- matlab graphminspantree
- RouterOS限速更高级运用
- 千万微信红包封面领取攻略,抢到你吐
- [七]RabbitMQ-客户端源码之AMQPImpl+Method
- Magento事件与事件监听
- 去掉Mybatis Generator生成的一堆 example
- EXCEL数组公式,群里求助的问题,按条件查最大值,中位数等, 可用数组公式解决
- 物联网服务器搭建记录,心得
- uc看视频显示服务器有点忙,UC3软件常见问题处理方案
- 华为路由器显示连接到服务器失败怎么办,华为路由器设置好后不能上网怎么办...
- [系统安全] 七.逆向分析之PE病毒原理、C++实现文件加解密及OllyDbg逆向
- 第一篇 使用numpy创建数组(一维、多维)
- mysql ext3 ext4_Mysql如何选择文件系统?(ext4 vs ext3 vs jfs vs xfs vs reise
- c语言编码 企业发放德奖金,C语言 · 企业奖金发放
- java l1是啥意思_L1-020 帅到没朋友 (20分) Java
- 2022上半年信息系统项目管理师论文真题
- 百万年薪背后 是人工智能领域泛起的人才泡沫 2017年07月04日 06:30 PingWest 微博 微信 空间 分享 添加喜爱 //d1.sina.com.cn/201706/26/14587
- vimeo 镜像_Vimeo API – OAuth和上传示例
- 自学 R 语言的十条干货技巧分享