您的位置:首页 > 其它

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,说明该奶牛的水平可以确定。

#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先循环。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: