flord(传递闭包)

来源:互联网 发布:linux 5创建文件命令 编辑:程序博客网 时间:2024/05/02 11:48

传递指对于一个节点i,如果j能到i,i能到k,那么j就能到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][b]=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;}

flord算法要K先循环。

0 0
原创粉丝点击