题目链接:点击查看

题目大意:给定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:

  1. 使用位运算代替加号
  2. 适当进行剪枝

直接上代码了,更详细的请看注释:

#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(最短路变形+闭包传递)相关推荐

  1. POJ 3660 Cow Contest [Floyd]

    POJ - 3660 Cow Contest http://poj.org/problem?id=3660 N (1 ≤ N ≤ 100) cows, conveniently numbered 1. ...

  2. POJ 3660 Cow Contest 传递闭包+Floyd

    原题链接:http://poj.org/problem?id=3660 Cow Contest Time Limit: 1000MS   Memory Limit: 65536K Total Subm ...

  3. POJ 3660 Cow Contest (闭包传递)

    Cow Contest Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7690   Accepted: 4288 Descr ...

  4. POJ 3660 Cow Contest【传递闭包】

    解题思路:给出n头牛,和这n头牛之间的m场比赛结果,问最后能知道多少头牛的排名. 首先考虑排名怎么想,如果知道一头牛打败了a头牛,以及b头牛打赢了这头牛,那么当且仅当a+b+1=n时可以知道排名,即为 ...

  5. [传递闭包]POJ#3660 Cow Contest

    题面 传送门 Cow Contest Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 24342 Accepted: 13539 ...

  6. POJ 3660 Cow Contest

    Description N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a programming con ...

  7. poj 3660 Cow Contest 传递闭包

    题目链接: http://poj.org/problem?id=3660 题目大意: 有n头牛,每头牛都有一个战斗值,农夫约翰想给这些牛排名次,但是只有m场比赛,约翰想知道有多少头牛的名次是确定的. ...

  8. POJ 3660 Cow Contest(传递闭包floyed算法)

    Description N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a programming con ...

  9. POJ - 3660 Cow Contest(flod)

    题意:有N头牛,M个关系,每个关系A B表示编号为A的牛比编号为B的牛强,问若想将N头牛按能力排名,有多少头牛的名次是确定的. 分析: 1.a[u][v]=1表示牛u比牛v强,flod扫一遍,可以将所 ...

最新文章

  1. 关于python和anaconda的一些基础认识
  2. 【bzoj1444】[Jsoi2009]有趣的游戏 AC自动机+矩阵乘法
  3. java可以入侵电脑系统吗_如何通过tomcat入侵远程计算机系统
  4. python飞机大战源代码-制作python程序windows安装包(飞机大战源码)
  5. 配置apache+php环境详解
  6. go语言 html 模板语法,go语言快速入门:template模板
  7. 『机房工程』弱电必备技能培训PPT/值得您分享
  8. linux ping库函数,Linux 常用基本命令 ping ifconfig
  9. [Ubuntu] bash shell soft-link error: Too many levels of symbolic links
  10. 中国电子技术标准化研究院与Linux基金会战略合作签约仪式圆满落幕
  11. 汉仪南宫体简 字体如何卸载删除?
  12. 瓜子2019笔试java_2019秋招瓜子携程笔试题解(含题目) 点赞有offer
  13. 自然人独资企业要上缴哪些税
  14. TRIZ系列-创新原理-18-机械振动原理
  15. 破解支付宝行为/滑动/投篮验证码,淘宝行为验证码同理
  16. 第十二章 软件壳(四)(代码抽取型壳)
  17. 天池-淘宝用户行为数据分析(python+Tableau)
  18. 网页计算器 html代码原理,HTML网页之计算器代码
  19. 神经网络阈值是什么意思,神经网络阈值怎么设置
  20. 2020中级计算机工程师,2020年上半年中级网络工程师报考详解

热门文章

  1. MySQL高级 - 锁 - InnoDB行锁 - 介绍及背景知识
  2. SpringSecurity remember功能持久化token信息
  3. 初识MQ--异步通讯的优缺点
  4. spring boot整合redis实现统计访问量
  5. linux mysql5.5 一主多从配置
  6. ThreadLocal的第二种用法 part2
  7. apollo数据库安装与常见错误说明
  8. linux centos7使用,linux之centos7防火墙基本使用
  9. python之路day9_亮仔的Python之路Day9——Python知识体系重组
  10. linux cat 进程,Linux下CAT程序的C实现