这题主要是传递闭包

题意: n头牛,m次测试,假设a牛赢过b牛,那么说明a牛的能力比b牛强,问你根据输入的m次测试结果,最多能确定多少条牛的排名

大题的思路:

  对于 k 牛,比他强的有x头牛,比他弱的有y头牛,只要x+y == n-1,那么x的排名就能确定

  也就是求任意两头牛之间能否到达

  每次测试都能加入一条新的边,用floyd求任意两点间能否抵达

  最后根据比他强和比他弱的个数求和等于n-1说明这头牛能确定排名

  。。。。。。

有点小细节:这个题假设a牛能胜过b牛,代表的是能力值高低,我们也是只要求确定能力值的排名,所以a牛赢过b牛,b牛赢过c牛,那么a牛一定能赢过c牛,c牛不可能赢过a牛

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int dis[][];
void flo(int n);
int main()
{
int n,m;
while(scanf("%d%d",&n,&m) != EOF)
{
memset(dis,,sizeof(dis));
while(m--)
{
int a,b;
scanf("%d %d",&a,&b);
dis[a][b] = ;
}
flo(n);
int ans = ;
for(int i = ; i <= n; ++i)
{
int c = ; for(int j = ; j <= n; ++j)
{
if(dis[i][j] == || dis[j][i]) c ++;
}
if(c == n-) ans ++;
}
cout << ans << endl;
}
}
void flo(int n)
{
for(int k = ; k <= n; ++k)
{
for(int i = ; i <= n; ++i)
{
for(int j = ; j <= n; ++j)
{
          //dis[i][i] 一定等于0 不用i==j continue
if(dis[i][k] == && dis[k][j] == )
dis[i][j] = ;
}
}
}
}

最新文章

  1. Excel自文本导入内容时如何做到单元格内换行
  2. EUI HSlider 实现音量控制
  3. 利用IIS导出,导入快速部署 web站点
  4. php各种编码集详解和以及在什么情况下进行使用
  5. resignFirstResponder
  6. access里like的通配符不能用%,要用*
  7. MFC多文档中opencv处理图像打开、保存
  8. OpenJudge 2810(1543) 完美立方 / Poj 1543 Perfect Cubes
  9. Java 六种异常处理的陋习(转)
  10. 详解Java动态代理机制(二)----cglib实现动态代理
  11. 第45篇 js操作打开本地程序
  12. WPF 水平进度条
  13. bulk
  14. Mysql在linux下载、安装详情,附带mysql安装包路径
  15. pgm1
  16. SQL 迭代查询语句
  17. CF576E Painting Edges
  18. 2018.09.30 bzoj3551:Peaks加强版(dfs序+主席树+倍增+kruskal重构树)
  19. Go语言学习笔记六: 循环语句
  20. fiddler抓包工具教程

热门文章

  1. Freemarker 对于数字的循环
  2. java、asp.net 通用分页码函数
  3. 20175126《Java程序设计》第六周学习总结
  4. 返回 字符串的 form和js组合让页面跳转
  5. linux中service XX start与直接运行/usr/bin/xx start的区别
  6. 大数据学习(一)-------- HDFS
  7. 进军的socket
  8. Java 日志体系(二)jcl 和 slf4j
  9. laravel-更换语言包
  10. java的基本数据类型和引用类型