您的位置:首页 > 其它

HDU-1869 六度分离 最短路

2013-10-21 18:36 330 查看
简单题 裸floyd 被DP虐了 把之前学的算法拉出来复习下

题意:

任何2个素不相识的人中间最多只隔着6个人,即只用6个人就可以将他们联系在一起,因此他的理论也被称为“六度分离”理论;

模型:

以直接认识的距离设为1 不认识的为无穷大 进行floyd(因为是要任意2个人) 最后判断是否有任意2人的距离超过7(间隔6人);

#include<stdio.h>
#include<string.h>
const int maxn = 205;
const int inf = 1<<29;
int n,m;
int dis[maxn][maxn];

void Floyd()
{
for( int k = 0; k < n; k ++ )
{
for( int i = 0; i < n; i ++ )
{
for( int j = 0; j < n; j ++ )
{
if( dis[i][j] > dis[i][k] + dis[k][j] )
dis[i][j] = dis[i][k] + dis[k][j];
}
}
}
}

int main()
{
//freopen( "data.in","r",stdin );
int a,b;
while( scanf("%d%d",&n,&m) == 2 )
{
for( int i = 0; i < n; i ++ )
{
for( int j = 0; j < n; j ++ )
{
if( i == j )
dis[i][j] = 0;
else
dis[i][j] = inf;
}
}
for( int i = 1; i <= m; i ++ )
{
scanf("%d%d",&a,&b);
dis[a][b] = dis[b][a] = 1;
}
Floyd();
int flag = 1;
for( int i = 0; i < n; i ++ )
{
for( int j = 0; j < n; j ++ )
{
if( dis[i][j] > 7 )
{
flag = 0;
break;
}
}
}
if( flag )
puts("Yes");
else
puts("No");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: