http://acm.hdu.edu.cn/showproblem.php?pid=1869
思路:最短路+floyd
分析:
1 题目是要求所有的数据能否满足“六度分离”,那么我们就想到所有点之间的最短距离。
2 应用floyd,如果两点之间有联系那么距离标记为1,那么最后只要判断是不是每两个人之间的距离是不是都不大于7(任何2个素不相识的人中间最多只隔着6个人,加起来最多8人,所以最多7条路)
Floyd算法适合于求解所有点之间的最短距离(全源最短路径),时间复杂度O(n^3)-----------不要怕,其实很简单,你肯定能行
本质是动态规划
#include "cstdio" #include "cstring" #include "algorithm" using namespace std; #define INF 0x3f3f3f3f #define MAX 110 int dis[MAX][MAX]; void init(int n) { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) dis[i][j]=INF; dis[i][i]=0; } } void floyd(int n) { for(int k=0;k<n;k++) { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]); } } } int main() { int n,m; while(~scanf("%d%d",&n,&m)&&n&&m) { init(n); int x,y; for(int i=0;i<m;i++) { scanf("%d%d",&x,&y); dis[x][y]=dis[y][x]=1; } floyd(n); int flag=0; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(dis[i][j]>7) { flag=1;break; } } if(flag)break; } if(!flag) printf("Yes "); else printf("No "); } return 0; }