六度分离

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5443    Accepted Submission(s): 2208

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号),以及他们之间的关系。
接下来有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
题意:任意两个人之间最多通过六个人连接叫做六度分离
思路:让任意两个人之间的最短路小于7即可
dijkstra算法:
  1. #include<stdio.h>
  2. #include<string.h>
  3. #define MAX 1000
  4. #define INF 0x3f3f3f
  5. int map[MAX][MAX],vis[MAX];
  6. int low[MAX];
  7. int n,m;
  8. int ok;
  9. void prime(int y,int x)
  10. {
  11. int i,j,next;
  12. int min,mincost=0;
  13. memset(vis,0,sizeof(vis));
  14. for(i=0;i<n;i++)
  15. {
  16. low[i]=map[y][i];
  17. }
  18. vis[y]=1;
  19. for(i=0;i<n-1;i++)
  20. {
  21. min=INF;
  22. for(j=0;j<n;j++)
  23. {
  24. if(!vis[j]&&min>low[j])
  25. {
  26. min=low[j];
  27. next=j;
  28. }
  29. }
  30. vis[next]=1;
  31. for(j=0;j<n;j++)
  32. {
  33. if(!vis[j]&&low[j]>map[next][j]+low[next])
  34. low[j]=map[next][j]+low[next];
  35. }
  36. }
  37. if(low[x]==INF||low[x]-1>6)
  38. {
  39. ok=0;
  40. printf("No\n");
  41. }
  42. }
  43. int main()
  44. {
  45. int j,i,s,t,l;
  46. int a,b;
  47. while(scanf("%d%d",&n,&m)!=EOF)
  48. {
  49. for(i=0;i<n;i++)
  50. {
  51. for(j=0;j<n;j++)
  52. {
  53. if(i==j)
  54. map[i][j]=map[j][i]=0;
  55. else
  56. map[i][j]=INF;
  57. }
  58. }
  59. for(i=0;i<m;i++)
  60. {
  61. scanf("%d%d",&a,&b);
  62. map[a][b]=map[b][a]=1;
  63. }
  64. ok=1;
  65. for(j=0;j<n;j++)
  66. {
  67. for(i=0;i<n;i++)
  68. {
  69. prime(j,i);
  70. if(ok==0)
  71. break;
  72. }
  73. if(ok==0)
  74. break;
  75. }
  76. if(ok)
  77. printf("Yes\n");
  78. }
  79. return 0;
  80. }

spfa:

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<queue>
  4. #define MAX 2000
  5. #define INF 0x3f3f3f
  6. using namespace std;
  7. int n,m,ans;
  8. int beg,en;
  9. int dis[MAX],vis[MAX];
  10. int head[MAX];
  11. struct node
  12. {
  13. int u,v,w;
  14. int next;
  15. }edge[MAX];
  16. void init()
  17. {
  18. ans=0;
  19. memset(head,-1,sizeof(head));
  20. }
  21. void add(int u,int v,int w)
  22. {
  23. edge[ans].u=u;
  24. edge[ans].v=v;
  25. edge[ans].w=w;
  26. edge[ans].next=head[u];
  27. head[u]=ans++;
  28. }
  29. void getmap()
  30. {
  31. int a,b;
  32. while(m--)
  33. {
  34. scanf("%d%d",&a,&b);
  35. add(a,b,1);
  36. add(b,a,1);
  37. }
  38. }
  39. void spfa(int sx)
  40. {
  41. int i,j;
  42. queue<int>q;
  43. memset(vis,0,sizeof(vis));
  44. for(i=0;i<=n;i++)
  45. dis[i]=INF;
  46. vis[sx]=1;
  47. dis[sx]=0;
  48. q.push(sx);
  49. while(!q.empty())
  50. {
  51. int u=q.front();
  52. q.pop();
  53. vis[u]=0;
  54. for(i=head[u];i!=-1;i=edge[i].next)
  55. {
  56. int top=edge[i].v;
  57. if(dis[top]>dis[u]+edge[i].w)
  58. {
  59. dis[top]=dis[u]+edge[i].w;
  60. if(!vis[top])
  61. {
  62. vis[top]=1;
  63. q.push(top);
  64. }
  65. }
  66. }
  67. }
  68. }
  69. void solve()
  70. {
  71. int i,j;
  72. int ok=0;
  73. for(i=0;i<n;i++)
  74. {
  75. spfa(i);
  76. for(j=0;j<n;j++)
  77. {
  78. if(dis[j]>7)
  79. {
  80. ok=1;
  81. break;
  82. }
  83. }
  84. if(ok)
  85. break;
  86. }
  87. if(ok)
  88. printf("No\n");
  89. else
  90. printf("Yes\n");
  91. }
  92. int main()
  93. {
  94. while(scanf("%d%d",&n,&m)!=EOF)
  95. {
  96. init();
  97. getmap();
  98. solve();
  99. }
  100. return 0;
  101. }

  

hdoj 1869 六度分离【最短路径求两两边之间最长边】的更多相关文章

  1. hdoj 1869 六度分离

    Problem Description 1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为“小世界现象(small world phenomenon)”的著名假说,大意是说,任何2个素不相 ...

  2. POJ1986(LCA应用:求两结点之间距离)

    Distance Queries Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 11304   Accepted: 3985 ...

  3. 求两个数之间的质数 -----------基于for循环 算法思想

    前端代码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.as ...

  4. Python基础-求两个字符串最长公共前轴

    最长公共前缀,输入两个字符串,如果存在公共前缀,求出最长的前缀,如果没有输出no.如“distance”和“discuss”的最长公共前缀是“dis”. s1 = input('请输入第1个字符串-- ...

  5. 求两个字符串最长子串的LCS算法 C语言实现(简短的实现函数)

    /************************************************************************* > File Name: lcs.c > ...

  6. js求连个数之间的数字

    整理出自项目中一个需求,求两个数之间的数字. const week = function(arr,arr2){ let a=parseInt(arr); let b=parseInt(arr2); l ...

  7. JavaScript求两个数字之间所有数字的和

    这是在fcc上的中级算法中的第一题,拉出来的原因并不是因为有什么好说的,而是我刚看时以为是求两个数字的和, 很显然错了.我感觉自己的文字理解能力被严重鄙视了- -.故拉出来折腾折腾. 要求: 给你一个 ...

  8. js 求两个日期之间相差天数

    //求两个日期之间的相差天数 function daysBetween(DateOne, DateTwo) { var OneMonth = DateOne.substring(5, DateOne. ...

  9. PHP 求两个日期之间相差的天数、月数

    <?php /** * 求两个日期之间相差的天数 * (针对1970年1月1日之后,求之前可以采用泰勒公式) * @param string $day1 * @param string $day ...

随机推荐

  1. wcf通道Channel

    正文 客户端与服务进行交互的过程是通过通道进行交互的.客户端通过调用代理类执行相应的方法,通过通道编码,调用上下文,传输客户端的事务,管理可靠会话,对消息正文的加密,最后要执行的通道是传输通道就像我们 ...

  2. spring mvc 和mybatis整合 的异常处理

    1.自定义异常信息类 通过构造函数来实现异常信息的接收 public class CustomException extends Exception { //异常信息 private String m ...

  3. thinkphp+mysql+bootstrap

    #thinkphp+mysql+bootstrapthinkphp3.2.3,bootstrap V3一个简易的企业cms网站系统,只要将clients的host改为对应的域名即可.thinkphp. ...

  4. C语言-05内存剖析

    1.进制 1. 二进制 1>     特点:只有0和1,逢2进1 2>     书写格式:0b或者0b开头 3>     使用场合:二进制指令\二进制文件,变量在内存中就是二进制存储 ...

  5. Entity Framework Code First 数据迁移

    需要在[工具 --> NuGet 程序包管理器 --> 程序包管理器控制台]中输入三个命令: Enable-Migrations (初次迁移时使用) Add-Migration [为本次迁 ...

  6. 第 3 章 单例模式【Singleton Pattern】

    以下内容出自:24种设计模式介绍与6大设计原则 这个模式是很有意思,而且比较简单,但是我还是要说因为它使用的是如此的广泛,如此的有人缘,单例就是单一.独苗的意思,那什么是独一份呢?你的思维是独一份,除 ...

  7. 【网络流24题】 No.3 最小路径覆盖问题 (网络流|匈牙利算法 ->最大二分匹配)

    [题意] 给定有向图 G=(V,E).设 P 是 G 的一个简单路(顶点不相交) 的集合.如果 V 中每个顶点恰好在 P 的一条路上,则称 P 是 G 的一个路径覆盖. P 中路径可以从 V 的任何一 ...

  8. *[hackerrank]Tree Covering

    https://www.hackerrank.com/contests/illuminati/challenges/tree-covering 这道题先是在上次交流讨论了一下,然后两位百度的朋友先写完 ...

  9. SPRING IN ACTION 第4版笔记-第二章WIRING BEANS-006-当构造函数有集合时的注入

    一.当构造函数有集合时,只能用<CONSTRUCTOR-ARG>,不能用C-NAMESPACE 二. 1. package soundsystem.collections; import ...

  10. 再探CRC

    之前写了CRC16的程序,虽说能用,却不知其所心然,现在要用CRC32,重温一遍,一下就通了.笔记如下 CRC我没记错的话是Cyclic Redundancy Code,Cyclic和Redundan ...