1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为“小世界现象(small world phenomenon)”的著名假说,大意是说,任何2个素不相识的人中间最多只隔着6个人,即只用6个人就可以将他们联系在一起,因此他的理论也被称为“六度分离”理论(six degrees of separation)。虽然米尔格兰姆的理论屡屡应验,一直也有很多社会学家对其兴趣浓厚,但是在30多年的时间里,它从来就没有得到过严谨的证明,只是一种带有传奇色彩的假说而已。

Lele对这个理论相当有兴趣,于是,他在HDU里对N个人展开了调查。他已经得到了他们之间的相识关系,现在就请你帮他验证一下“六度分离”是否成立吧。

Input

本题目包含多组测试,请处理到文件结束。 
对于每组测试,第一行包含两个整数N,M(0<N<100,0<M<200),分别代表HDU里的人数(这些人分别编成0~N-1号),以及他们之间的关系。 
接下来有M行,每行两个整数A,B(0<=A,B<N)表示HDU里编号为A和编号B的人互相认识。 
除了这M组关系,其他任意两人之间均不相识。

Output

对于每组测试,如果数据符合“六度分离”理论就在一行里输出"Yes",否则输出"No"。

Sample Input

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

Sample Output

Yes
Yes

这个题对时间复杂度要求不高

两种算法

1.Floyd算法

//Floyd算法
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define Inf 0x3f3f3f3f
int n,m;
int dis[105][105];
void Floyd()
{for(int i=0;i<n;i++)for(int j=0;j<n;j++)for(int k=0;k<n;k++)if(dis[j][k]>dis[j][i]+dis[i][k])dis[j][k]=dis[j][i]+dis[i][k];
}
bool Is()
{for(int i=0;i<n;i++)for(int j=i+1;j<n;j++)if(dis[i][j]-1>6)return false;return true;
}
int main()
{while(~scanf("%d%d",&n,&m)){memset(dis,Inf,sizeof(dis));int a,b;for(int i=0;i<m;i++){cin>>a>>b;dis[a][b]=dis[b][a]=1;}Floyd();if(Is())cout<<"Yes"<<endl;elsecout<<"No"<<endl;}return 0;
}

2.Dijkstra算法

注意:

if(dis[u]>7 || u==s)//此处一定要判断是否有独立的点,如有独立的点,命题不成立 
        {
            flag=0;
            return false;
        
        }

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define Inf 0x3f3f3f3f
const int N=105;
int n,m;
int g[N][N];
int vis[N];
int dis[N];int flag;
void GetMap()
{memset(g,Inf,sizeof(g));for(int i=0;i<n;i++)g[i][i]=0;for(int i=0;i<m;i++){int a,b;cin>>a>>b;g[a][b]=g[b][a]=1;}
}
bool  Dijkstra(int s)
{memset(vis,0,sizeof(vis));for(int i=0;i<n;i++)dis[i]=g[s][i];vis[s]=1;for(int k=1;k<n;k++){int minn=Inf,u=s;for(int i=0;i<n;i++){if(!vis[i]&&dis[i]<minn){minn=dis[i];u=i;}} if(dis[u]>7 || u==s)//此处一定要判断是否有独立的点,如有独立的点,命题不成立 {flag=0;return false;}vis[u]=1;for(int i=0;i<n;i++){if(dis[i]>dis[u]+g[u][i])dis[i]=dis[u]+g[u][i];} }return true;
}
int main()
{while(scanf("%d%d",&n,&m)!=EOF){GetMap();for(int i=0;i<n;i++){flag=1;if(!Dijkstra(i)) break;}if(flag)    cout<<"Yes"<<endl;else  cout<<"No"<<endl;}return 0;} 

六度分离 (无向图最短路径问题)相关推荐

  1. 教你一招|Python实现无向图最短路径

    一心想学习算法,很少去真正静下心来去研究,前几天趁着周末去了解了最短路径的资料,用python写了一个最短路径算法.算法是基于带权无向图去寻找两个点之间的最短路径,数据存储用邻接矩阵记录.首先画出一幅 ...

  2. 【九度OJ】1008【加权无向图最短路径】

    在网上查了一下,加权无向图最短路解法DFS和Dijkstra多一些,一般不用BFS 我选择用DFS,用时380MS,看了一下其他人的,最好的是240MS,用的是Dijkstra.都是采用邻接矩阵存储图 ...

  3. 数据结构最短路径例题_编程小白暑期进阶笔记45-C语言数据结构与算法最短路径和dijkstra算法...

    最短路径 算法特点: 迪科斯彻算法使用了广度优先搜索解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树.该算法常用于路由算法或者作为其他图算法的一个子模块. 算法思路: Dijks ...

  4. 四大算法解决最短路径问题(Dijkstra+Bellman-ford+SPFA+Floyd)

    什么是最短路径问题? 简单来讲,就是用于计算一个节点到其他所有节点的最短路径. 单源最短路算法:已知起点,求到达其他点的最短路径. 常用算法:Dijkstra算法.Bellman-ford算法.SPF ...

  5. 最短路径和距离及可视化——matlab

    文章目录 一.前言 二.最短路线 2.1 教程 2.1.1 sparse创建稀疏矩阵 2.1.2 有向图最短路径(1) 2.1.3 有向图最短路径(2) 2.1.4 无向图最短路径(1) 2.1.5无 ...

  6. 求解两点间最短路径的算法

    最短路径算法 1.Dijkstra算法 2.Bellman-Ford算法 3.SPFA算法 4.Floyd算法 几种最短路径算法的对比 Dijkstra算法.Bellman-Ford算法和SPFA算法 ...

  7. 数据结构—图(Part Ⅱ)—最小生成树 最短路径

    目录 最小生成树 普里姆(Prim)算法 算法实现 运行结果 程序分析 克鲁斯卡尔(Kruskal)算法 算法实现 运行结果 程序分析 最短路径 广度优先搜索(BFS)算法 算法实现 运行结果 程序分 ...

  8. 20162305 2016-2017-2《程序设计与数据结构》课程总结

    20162305 2017-2018-2<程序设计与数据结构>课程总结 每周作业链接汇总 第一周作业: 简要内容: 什么是算法 算法的时间复杂度 什么是数据结构 二维码: 第二周作业 简要 ...

  9. python networkx库_python之networkx库小结

    备战数模,还是知道多点好.networkx这个库的话,画网络图贼好用. 一.安装 安装的话,跟其他包的安装差不多吧.我用的是anaconda就不用装了.其他的话,就用pip install netwo ...

最新文章

  1. AutoML很火,过度吹捧的结果?
  2. 软件开发的N种基础武器 - 最新清单
  3. 将Sublime Text 3设置为Python全栈开发环境
  4. Maven集成指令总结
  5. Python学习之urlib模块和urllib2模块学习
  6. idea页面简单介绍
  7. 深度学习之生成对抗网络(8)WGAN-GP实战
  8. sql server数据表转换成xml
  9. 计算机系统-任务切换
  10. Spring-tx-TransactionStatus接口(savepoint)
  11. 支付宝推出“轻会员”;iPhone11 或将主动禁用双向无线充电;Java 13 发布 | 极客头条...
  12. 手机自动化测试的原理
  13. Unreal Engine虚幻引擎下载与安装
  14. 计算机应用基础练习题库与答案
  15. 调用高德地图API接口,实现地铁站经纬度采集
  16. 中华名将索引 - 第一批:廉颇
  17. 网易传媒数据指标体系搭建实战!
  18. win10 内存清理
  19. 工厂方法模式、简单工厂模式、抽象工程模式
  20. 合作开发收费系统——临时表解决用户重复登录问题

热门文章

  1. 用WinFlash工具更新BIOS版本
  2. vue前端项目引用高德离线地图
  3. 【Python数据分析】美国某州牛油果销售量数据集分析
  4. pandas.pivot()函数的使用
  5. JS笔记 (四)数组,json对象,数据类型 ,if 判断,swich 判断,三目运算 判断
  6. PG2 BYPASS源码阅读 学习x64解密定时器、特征码定位
  7. 英语中常见的语音现象
  8. cuda编程:稀疏矩阵乘法结合MINRES算法求解泊松方程的并行编程
  9. 云栖大会首设“科技脱贫”专场 ,20张会场门票等你来拿!
  10. 算法中的基础数学知识(一)—初等数论