标签:
本题链接:点击打开链接
本题大意:
输入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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/lsgbb/article/details/47731527