标签:
http://acm.hdu.edu.cn/showproblem.php?pid=1869
8 7 0 1 1 2 2 3 3 4 4 5 5 6 6 7 8 8 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 0
Yes Yes
#include<stdio.h>
#include<string.h>
#define INF 0x3f3f3f3f
int map[110][110];
int dis[220];
bool used[220];
int n;
bool dijkstra(int u)
{
int i,j;
memset(used,0,sizeof(used));
memset(dis,INF,sizeof(dis));
int pos=u;
for(i=0;i<n;++i)//第一次给dis赋值
{
dis[i]=map[u][i];
}
dis[u]=0;
used[u]=1;
for(i=1;i<n;++i)//再找n-1个点
{
int min=INF;
for(j=0;j<n;++j)
{
if(!used[j]&&dis[j]<min)
{
min=dis[j];
pos=j;
}
}
if(min==INF||dis[pos]>7) break;//只要两个人通过其他人的依然没有连通就不可能六度分离成立
used[pos]=1;
dis[pos]=min;
for(j=0;j<n;++j)//把dis数组更新,也叫松弛
{
if(!used[j]&&dis[j]>map[pos][j]+dis[pos])
{
dis[j]=map[pos][j]+dis[pos];
}
}
}
if(i<n) return 0;
else return 1;
}
int main()
{
int m;
int u,v;
int i,j;
while(~scanf("%d%d",&n,&m))
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
map[i][j]=INF;
while(m--)
{
scanf("%d%d",&u,&v);
if(u!=v) //u和v相等时map[u][v]=0;
map[u][v]=map[v][u]=1;
}
int flag=0;
for(i=0;i<n;++i)
{
if(!dijkstra(i)) //每个都要判断
{
flag=1;
break;
}
}
if(flag)printf("No\n");
else printf("Yes\n");
}
return 0;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/yuzhiwei1995/article/details/47732999