Time Limit : 5000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)

Total Submission(s) : 36   Accepted Submission(s) : 16
Problem Description
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号),以及他们之间的关系。 <="" div="" 除了这m组关系。其它随意两人之间均不相识。="" 接下来有m行,每行两个整数a,b(0<="A,B<N)表示HDU里编号为A和编号B的人互相认识。

">

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
#include<stdio.h>
#include<string.h>
#define M  10000000
#define min(a,b) (a)>(b)?(b):(a)
int map[202][202];
int vis[202],dist[202];
int n,s,t,flag;
int  dijkstra(int s)
{int min,i,j,k;memset(vis,0,sizeof(vis));for(i=0; i<n; i++)dist[i]=M;dist[s]=0;for(i=0; i<n; i++){k=-1;for(j=0; j<n; j++)if(!vis[j]&&(k==-1||dist[j]<dist[k]))k=j;if(dist[k]>7||k==-1){flag=0;return 0;}vis[k]=1;for(j=0; j<n; j++)dist[j]=min(dist[j],dist[k]+map[k][j]);}return 1;
}int main()
{int i,j,x,y,z,m;while(scanf("%d%d",&n,&m)!=EOF){flag=1;for(i=0; i<n; i++)for(j=0; j<n; j++)map[i][j]=map[j][i]=M;for(i=0; i<m; i++){scanf("%d%d",&x,&y);map[y][x]=1;map[x][y]=1;}for(i=0;i<n;i++)if(!dijkstra(i))//少了一个!

break; if(flag) printf("Yes\n"); else printf("No\n"); } return 0; }

再贴一个spfa算法写的代码。

#include<stdio.h>
#include<queue>
#include<string.h>
#include<algorithm>
using namespace std;
struct stu{int one,two,val,next;
};
stu edge[30000];
int vid[3000],vist[30000],head[30000],t,N,M,flag;
int spfa(int s)
{memset(vid,0,sizeof(vid));memset(vist,0x3f3f3f3f,sizeof(vist));queue<int> q;q.push(s);vid[s]=1;vist[s]=0;while(!q.empty()){int u=q.front();q.pop();vid[u]=0;for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].two;if(vist[v]>vist[u]+edge[i].val){vist[v]=vist[u]+edge[i].val;if(!vid[v]){q.push(v);vid[v]=1;}}}}for(int i=0;i<N;++i)if(vist[i]>7){flag=0;return 0;}return 1;
}
void get(int u,int v,int w)
{stu E={u,v,w,head[u]};edge[t]=E;head[u]=t++;
}
int main()
{while(scanf("%d%d",&N,&M)!=EOF){t=0;flag=1;memset(head,-1,sizeof(head));int i,j,a,b,c;for(i=0;i<M;i++){scanf("%d%d",&a,&b);get(a,b,1);get(b,a,1);}for(i=0;i<N;i++)if(!spfa(i))break;if(flag)printf("Yes\n");else printf("No\n");}return 0;
}

再贴一个floyd()算法写的程序

#include<stdio.h>
#include<string.h>
#define INL 0x3f3f3f3f
#define min(a,b)  (a)>(b)?(b):(a)//这个地方弄错了,弄成大于了。把这个改了一下就不超时了
int x[110][110];
int n,m;
void floyd()
{for(int k=0;k<n;k++)for(int i=0;i<n;i++)for(int j=0;j<n;j++) x[i][j]=min(x[i][j],x[i][k]+x[k][j]);
}
int main()
{int i,j,k,flag,a,b;while(scanf("%d%d",&n,&m)!=EOF){for(i=0;i<n;i++)//这个地方应该写成n,错写成m了<img alt="哭" src="http://static.blog.csdn.net/xheditor/xheditor_emot/default/cry.gif" />for(j=0;j<m;j++)x[i][j]=INL;for(i=0;i<m;i++){scanf("%d%d",&a,&b);x[a][b]=x[b][a]=1;}floyd();flag=0;for(i=0;i<n;i++){for(j=0;j<n;j++)if(x[i][j]>7||x[i][j]==INL){flag=1;break;}if(flag)break;}if(flag) printf("No\n");else  printf("Yes\n");}return 0;
}

六度分离(floyd算法,SPFA算法,最短路—Dijkstra算法)相关推荐

  1. 03 最短路 dijkstra算法spfa算法floyd算法(附带实例代码) 图论-1

    文章目录 最短路 邻接表的图如下 邻接矩阵如下图 链表实现邻接表实现代码 单源最短路径 Dijkstra 算法 朴素版本 Dijkstra 实现代码 堆优化的dijkstra算法代码实现 Bellma ...

  2. 单源最短路 Dijkstra算法 和 SPFA算法

    单源最短路 •从一个点出发,到达其他顶点的最短路径的长度. •基本操作:松弛 •d[u]+map[u, v]< d[v]这样的边(u,v)称为紧的(tense),可以对它进行松弛(relax): ...

  3. 图论-最短路Dijkstra算法详解超详 有图解

    整体来看dij就是从起点开始扩散致整个图的过程,为什么说他稳定呢,是因为他每次迭代,都能得到至少一个结点的最短路.(不像SPFA,玄学复杂度) 但是他的缺点就是不能处理带负权值的边,和代码量稍稍复杂. ...

  4. python棋盘最短路径_Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例...

    本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...

  5. 图的最短路径算法及matlab实现(Dijkstra算法、Floyd算法、Bellman-Ford算法、Johnson 算法)

    图的最短路径算法 Dijkstra算法 Dijkstra算法研究的是从初始点到其他任一结点的最短路径,即单源最短路径问题,其对图的要求是不存在负权值的边. Dijkstra算法主要特点是以起始点为中心 ...

  6. 单源最短路——dijkstra算法

    Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 问 ...

  7. 图论 —— 最短路 —— Dijkstra 算法

    [概述] Dijkstra 算法是单源最短路径算法,即计算起点只有一个的情况到其他点的最短路径,其无法处理存在负边权的情况. 其时间复杂度是:O(E+VlogV) [算法分析] 将点分为两类,一类是已 ...

  8. 图论算法讲解--最短路--Dijkstra算法

    一.绪论 要学习最短路算法我们首先应该知道什么是图以及什么是最短路. 图在离散数学中的定义为:图G=(V,E)是一个二元组(V,E)使得E⊆[V]的平方,所以E的元素是V的2-元子集.为了避免符号上的 ...

  9. POJ-3268-最短路(dijkstra算法)

    Silver Cow Party Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12494   Accepted: 5568 ...

  10. 最短路dijkstra算法详解_最短路径问题---Dijkstra算法详解

    1.Dijkstra算法介绍 · 算法起源: · Djkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家E ...

最新文章

  1. 深入剖析RocketMQ源码-NameServer
  2. ++i 和 i++ 效率分析(C++)
  3. oracle 实例用法,Oracle merge into用法以及相关例子示例
  4. 洛谷 P1242 新汉诺塔
  5. android setContentView处理流程
  6. php yii框架源码,yii 源码解读
  7. 8.10模拟:贪心、最优化思路
  8. RabbiqMQ快速入门
  9. 前端学习(1524):ES6模块导入和导出
  10. 15 操作系统第四章 文件管理 文件的物理结构 文件存储空间管理
  11. MongoDB 用户管理
  12. 【转】Objective-C语法property详解
  13. java treeset排序_java TreeSet的排序之自然排序
  14. 同步计数器 CountDownLatch
  15. 【COCOS2DX-LUA 脚本开发之十二】Hybrid模式-利用AssetsManager实现在线更新脚本文件lua、js、图片等资源(免去平台审核周期)...
  16. Java写的斗地主游戏源码
  17. a5m2使用方法 mysql_反転
  18. 马化腾:通向互联网未来的七个路标
  19. SAP UI5 应用开发教程之六十九 - 如何从 SAP UI5 Not Found 页面跳转回到正常的应用页面试读版
  20. 儿童python编程app_Python编程狮app下载

热门文章

  1. rdma_RDMA:基本原理和自举探索
  2. 安装图解:Linux Mint 4.0(Daryna)(或者说完美的桌面系统)
  3. 佳博80系列小票打印机 gp 80180安装驱动,显示打印错误
  4. SAP 打开总账科目
  5. linux 查看文件最后几行
  6. 自然语言处理----常用函数简析
  7. python中shelf对象_11.4. shelve — Python 对象持久化 — Python 2.7.18 文档
  8. python test suite什么意思_在python中创建testsuite
  9. 使用Termux在安卓手机上运行tomcat服务器
  10. 亚马逊入驻商用户画像分析