POJ - 3660 Cow Contest(最短路变形+闭包传递)
题目链接:点击查看
题目大意:给定n头牛和m个关系,每个关系表示为两个整数a与b,其意义为a牛能打败b牛,问可以确定排名的牛的数量。
题目分析:
在这里先说一下关系闭包:
关系闭包有三种: 自反闭包(r), 对称闭包(s), 传递闭包(t)。
先画出 R 的关系图,再画出 r(R),s(R), t(R) 的关系图。
这个题用到的是关系闭包。
复制一段别人的理解:
关系之间具有传递性(例如a> b, b> c, 那么a> c), 在那些已给出的关系基础上, 通过传递性, 把所有可能的关系都找出来。
这里需要先求一下所有牛之间的传递闭包, 那么我们这题与传递闭包又有什么关系呢。 下面将慢慢解答。
如果一头牛被x头牛打败,并且可以打败y头牛,如果x+y=n-1,则我们容易知道这头牛的排名就被确定了,所以我们只要将任一
头牛,可以打败其他的牛的个数x, 和能打败该牛的牛的个数y求出来,在遍历所有牛判断一下是否满足x+y=n-1,就知道这个牛
的排名是否能确定了(而传递闭包,正好将所有能得出关系都求出来了), 再将满足这个条件的牛数目加起来就是所求解。 x可
以看成是入度, y是出度。
在floyd-warshall求每对顶点间的最短路径算法中,可以通过O()的方法求出图的传递闭包。可以位每条边赋以权值1,然后运行
Floyd-Wareshall。如果从 i 到 j 存在一条路径,则d(i,j)<N,否则d(i,j)=MAX。
在这里有两个细节可以优化一下Floyd:
- 使用位运算代替加号
- 适当进行剪枝
直接上代码了,更详细的请看注释:
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<sstream>
#include<cmath>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=110;int n,m;int maze[N][N];void floyd()//求图的闭包,可以把所有的关系求出来
{for(int k=1;k<=n;k++)for(int i=1;i<=n;i++){if(!maze[i][k])//剪枝,如果maze[i][j]为0,则maze[i][k]&maze[k][j]必为0,
//对于原结果来说没有影响,故没有继续下一层循环的必要continue;for(int j=1;j<=n;j++){maze[i][j]|=maze[i][k]&maze[k][j];}}
}int main()
{
// freopen("input.txt","r",stdin);while(scanf("%d%d",&n,&m)!=EOF){memset(maze,0,sizeof(maze));//因为是求闭包关系,所以全部初始化为0 for(int i=1;i<=m;i++){int a,b;scanf("%d%d",&a,&b);maze[a][b]=1;//有关系的设置为1,利用位运算能加快速度 }floyd();int ans=0;for(int i=1;i<=n;i++)//外层遍历一边n个点{int cnt=0;for(int j=1;j<=n;j++)//内层遍历一边除了i点外的n-1个点{if(i==j)continue;if(maze[i][j]||maze[j][i])//maze[i][j]==1表示i能打败j,maze[j][i]==1表示j能打败icnt++;}if(cnt==n-1)//如果i点与其余n-1个点都有关系,则i点的关系是可以被确定的ans++;}cout<<ans<<endl;}return 0;
}
POJ - 3660 Cow Contest(最短路变形+闭包传递)相关推荐
- POJ 3660 Cow Contest [Floyd]
POJ - 3660 Cow Contest http://poj.org/problem?id=3660 N (1 ≤ N ≤ 100) cows, conveniently numbered 1. ...
- POJ 3660 Cow Contest 传递闭包+Floyd
原题链接:http://poj.org/problem?id=3660 Cow Contest Time Limit: 1000MS Memory Limit: 65536K Total Subm ...
- POJ 3660 Cow Contest (闭包传递)
Cow Contest Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7690 Accepted: 4288 Descr ...
- POJ 3660 Cow Contest【传递闭包】
解题思路:给出n头牛,和这n头牛之间的m场比赛结果,问最后能知道多少头牛的排名. 首先考虑排名怎么想,如果知道一头牛打败了a头牛,以及b头牛打赢了这头牛,那么当且仅当a+b+1=n时可以知道排名,即为 ...
- [传递闭包]POJ#3660 Cow Contest
题面 传送门 Cow Contest Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 24342 Accepted: 13539 ...
- POJ 3660 Cow Contest
Description N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a programming con ...
- poj 3660 Cow Contest 传递闭包
题目链接: http://poj.org/problem?id=3660 题目大意: 有n头牛,每头牛都有一个战斗值,农夫约翰想给这些牛排名次,但是只有m场比赛,约翰想知道有多少头牛的名次是确定的. ...
- POJ 3660 Cow Contest(传递闭包floyed算法)
Description N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a programming con ...
- POJ - 3660 Cow Contest(flod)
题意:有N头牛,M个关系,每个关系A B表示编号为A的牛比编号为B的牛强,问若想将N头牛按能力排名,有多少头牛的名次是确定的. 分析: 1.a[u][v]=1表示牛u比牛v强,flod扫一遍,可以将所 ...
最新文章
- 关于python和anaconda的一些基础认识
- 【bzoj1444】[Jsoi2009]有趣的游戏 AC自动机+矩阵乘法
- java可以入侵电脑系统吗_如何通过tomcat入侵远程计算机系统
- python飞机大战源代码-制作python程序windows安装包(飞机大战源码)
- 配置apache+php环境详解
- go语言 html 模板语法,go语言快速入门:template模板
- 『机房工程』弱电必备技能培训PPT/值得您分享
- linux ping库函数,Linux 常用基本命令 ping ifconfig
- [Ubuntu] bash shell soft-link error: Too many levels of symbolic links
- 中国电子技术标准化研究院与Linux基金会战略合作签约仪式圆满落幕
- 汉仪南宫体简 字体如何卸载删除?
- 瓜子2019笔试java_2019秋招瓜子携程笔试题解(含题目) 点赞有offer
- 自然人独资企业要上缴哪些税
- TRIZ系列-创新原理-18-机械振动原理
- 破解支付宝行为/滑动/投篮验证码,淘宝行为验证码同理
- 第十二章 软件壳(四)(代码抽取型壳)
- 天池-淘宝用户行为数据分析(python+Tableau)
- 网页计算器 html代码原理,HTML网页之计算器代码
- 神经网络阈值是什么意思,神经网络阈值怎么设置
- 2020中级计算机工程师,2020年上半年中级网络工程师报考详解
热门文章
- MySQL高级 - 锁 - InnoDB行锁 - 介绍及背景知识
- SpringSecurity remember功能持久化token信息
- 初识MQ--异步通讯的优缺点
- spring boot整合redis实现统计访问量
- linux mysql5.5 一主多从配置
- ThreadLocal的第二种用法 part2
- apollo数据库安装与常见错误说明
- linux centos7使用,linux之centos7防火墙基本使用
- python之路day9_亮仔的Python之路Day9——Python知识体系重组
- linux cat 进程,Linux下CAT程序的C实现