本题链接:点击打开链接
本题大意:
输入n和m,标号为0--(n-1),有m组数据,每组数据代表两人有关系,证明“六度分离”说法的正确性。
解题思路:
本题亦可看做求距离,不妨将认识的两人之间的权值记为1,则就变成了看是否有人之间的距离大于7(即最多相隔六个人)。求每人之间的距离使用dijkstra算法。
参考代码:
#include<string.h>
#include<stdio.h>
#define INF 0xffffff
int map[110][110];
int mark[110];
int dis[210];
int n,m,flag;
void dijkstra(int s)//迪克拉斯算法,求各点距起点s的最短距离
{
memset(mark,0,sizeof(mark));
for(int i=0;i<n;i++)
dis[i]=INF;
dis[s]=0;
for(int i=0;i<n;i++)
{
int vir,min=INF;
for(int j=0;j<n;j++)
{
if(!mark[j]&&dis[j]<min)
{
min=dis[j];
vir=j;
}
}
if(min==INF) break;
mark[vir]=1;
for(int j=0;j<n;j++)
if(!mark[j]&&dis[j]>dis[vir]+map[vir][j])
dis[j]=dis[vir]+map[vir][j];
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
map[i][j]=INF;
int x,y;
flag=0;
for(int i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
map[x][y]=1;
map[y][x]=1;//当做无向图处理
}
for(int i=0;i<n;i++)
{
dijkstra(i);//求每个人据此人的距离
for(int j=0;j<n;j++)//查看与每个人的距离是否满足“六度分离”条件
{
if(dis[j]>7)
{
flag=1;
break;
}
}
}
if(flag)//标记,说明不满足
printf("No\n");
else
printf("Yes\n");
}
return 0;
}