flord(传递闭包)
2017-01-14 17:19
344 查看
传递指对于一个节点i,如果j能到i,i能到k,那么j就能到k。
传递闭包,就是把图中所有满足这样传递性的节点都弄出来,计算完成后,我们也就知道任意两个节点之间是否相连。
break 指跳出一层循环;continue 结束本次循环,跳过本次判断语句
题目链接:http://poj.org/problem?id=3660
每只奶牛的技能独一无二,如果给奶牛们排序的话,能确定自己技能水平的奶牛排序后位置不变。
一只奶牛可以确定自己的水平,则一定和其他n-1只奶牛直接或间接比试过。
使用Floyd传递闭包算法,统计能赢过它的奶牛数+它赢过的奶牛数。如果这个数字等于n-1,说明该奶牛的水平可以确定。
[b]flord算法要K先循环。
传递闭包,就是把图中所有满足这样传递性的节点都弄出来,计算完成后,我们也就知道任意两个节点之间是否相连。
break 指跳出一层循环;continue 结束本次循环,跳过本次判断语句
题目链接:http://poj.org/problem?id=3660
每只奶牛的技能独一无二,如果给奶牛们排序的话,能确定自己技能水平的奶牛排序后位置不变。
一只奶牛可以确定自己的水平,则一定和其他n-1只奶牛直接或间接比试过。
使用Floyd传递闭包算法,统计能赢过它的奶牛数+它赢过的奶牛数。如果这个数字等于n-1,说明该奶牛的水平可以确定。
#include <iostream> using namespace std; const int max_n=101; bool dp[max_n][max_n]; int main() { int n,m; cin>>n>>m; for(int i=1;i<=m;i++) { int a,b; cin>>a>>b; dp[a]=true; } for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(i==k||i==j||j==i) continue; dp[i][j]=dp[i][j]||(dp[i][k]&&dp[k][j]); } int ans=0; for(int i=1;i<=n;i++) { int sum=0; for(int j=1;j<=n;j++) { if(i!=j&&dp[i][j]) sum++; } for(int j=1;j<=n;j++) { if(i!=j&&dp[j][i]) sum++; } if(sum==n-1) ans++; } cout<<ans; return 0; }
[b]flord算法要K先循环。
相关文章推荐
- C++中的模板编程
- 文件包含命令以及C语言预处理概述
- Java利器之UML类图详解
- Plan1
- (17)Powershell中的重定向运算符
- 集合框架_集合多层嵌套的代码体现
- 李白打酒
- 交换最少次数得到回文
- Ubuntu安装mysql
- sping
- 关于locate这个NB命令我不得不深入的学习
- 2 java数组总结
- 最短路计数 洛谷 1114 最短路
- 关于 handler 书写代码 引起的几个问题
- python基础语法(7) 函数2
- SQL Server ->> SQL Server 2016新特性之 --- Query Store
- MVC ---- T4模板的小练习
- 树莓派uboot的串口初始化(uboot驱动结构 2通用解析)
- PAT乙级1056
- 【matlab】isstrprop 解读