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
 
思路:每个顶点到其他各点中间相隔的点的数量都不会超过六个, 根据这个利用dijkstra算法来编写代码
 
dijkstra代码:
  1. #include <stdio.h>
  2. #define INF 0x3f3f3f3f
  3. #include <algorithm>
  4. using namespace std;
  5. int n, m;
  6. int dis[], vis[], cost[][];
    //dis用来记录除此人外他是否与其他人认识,vis用来标记某人是否被访问过,cost用来记录两个人之间是否认识
  7. int min(int x, int y)//求两个整数之间较小的数
  8. {
  9. return x < y ? x : y;
  10. }
  11. int cmp(int x, int y)//自定义降序排列
  12. {
  13. return x > y;
  14. }
  15. int dijkstra(int i)//利用dijkstra方法求两个人之间的距离,i为源点
  16. {
  17. int u, v, flag = ;
  18. for(u = ; u < n; u++)//将所有点到远点的距离设为无穷大
  19. {
  20. dis[u] = INF;
  21. vis[u] = ;//标记所有点都未访问
  22. }
  23. dis[i] = ;//源点到自身的距离为0
  24. while(true)
  25. {
  26. v = -;
  27. for(u = ; u < n; u++)
  28. if(!vis[u] && (v == - || dis[v] > dis[u]))//求未曾访问过且距离源点最近的人(即认识的人)
  29. v = u;
  30. if(v == -)//如果v=-1,表明无人认识源点或是所有的点都被访问过,就跳出循环
  31. break;
  32. vis[v] = ;//标记据源点最近的人
  33. for(u = ; u < n; u++)//更新权值,即各点到源点的距离
  34. dis[u] = min(dis[u], dis[v] + cost[v][u]);
  35. }
  36. sort(dis, dis+n, cmp);//对所有点到源点的距离进行降序排列
  37. if(dis[] > )//只要距离最大的距离大于7,即六度分离定理不成立
  38. flag = ;//用flag记录结果
  39. return flag;
  40. }
  41. int main()
  42. {
  43. int i, j;
  44. while(~scanf("%d%d", &n, &m))
  45. {
  46. int a, b;
  47. for(i = ; i < n; i++)//对cost进行初始化
  48. for(j = ; j < n; j++)
  49. cost[i][j] = INF;
  50. while(m--)
  51. {
  52. scanf("%d%d", &a, &b);
  53. cost[a][b] = cost[b][a] = ; //若两个人认识,则将两个人之间的距离设为1,否则为无穷大
  54. }
  55. for(i = ; i < n; i++)
  56. {
  57. if(!dijkstra(i))//求任意一个人到其他所有人的距离,只要有大于7的,就输出结果,跳出循环
  58. {
  59. printf("No\n");
  60. break;
  61. }
  62. }
  63. if(i == n)//如果i=n证明任何两个人之间的距离都不会超过7,输出Yes
  64. printf("Yes\n");
  65. }
  66. return ;
  67. }

spfa代码:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <queue>
  4. # define INF 0x3f3f3f3f
  5. #define N 110
  6. #define M 450
  7. using namespace std;
  8.  
  9. struct node
  10. {
  11. int from, to, val, next;
  12. };
  13. node edge[M];
  14. int n, m, cnt;
  15. int dis[N], vis[N], head[N];
  16. void add(int x, int y)
  17. {
  18. node e = {x, y, , head[x]};
  19. edge[cnt] = e;
  20. head[x] = cnt++;
  21. }
  22. void SPFA(int s)
  23. {
  24. queue<int>q;
  25. memset(vis, , sizeof(vis));
  26. memset(dis, INF, sizeof(dis));
  27. q.push(s);
  28. vis[s] = ;
  29. dis[s] = ;
  30. while(!q.empty())
  31. {
  32. int u = q.front();
  33. q.pop();
  34. vis[u] = ;
  35. for(int i = head[u]; i != -; i = edge[i].next)
  36. {
  37. int v = edge[i].to;
  38. if(dis[v] > dis[u] + edge[i].val)
  39. {
  40. dis[v] = dis[u] + edge[i].val;
  41. if(!vis[v])
  42. {
  43. vis[v] = ;
  44. q.push(v);
  45. }
  46. }
  47. }
  48. }
  49. }
  50. int main()
  51. {
  52. while(~scanf("%d%d", &n, &m))
  53. {
  54. cnt = ;
  55. int flag = ;
  56. memset(head, -, sizeof(head));
  57. while(m--)
  58. {
  59. int a, b;
  60. scanf("%d%d", &a, &b);
  61. add(a, b);
  62. add(b, a);
  63. }
  64. for(int i = ; i < n; i++)
  65. {
  66. SPFA(i);
  67. for(int j = ; j < n; j++)
  68. {
  69. if(dis[j] > )
  70. {
  71. flag = ;
  72. break;
  73. }
  74. }
  75. }
  76. if(flag)
  77. printf("Yes\n");
  78. else
  79. printf("No\n");
  80. }
  81. return ;
  82. }

floyd代码:

  1. #include <stdio.h>
  2. #define inf 0x3f3f3f3f
  3. int n, m, dis[][];
  4. void floyd()
  5. {
  6. int i, j, k;
  7. for(i = ; i < n; i++)
  8. for(j = ; j < n; j++)
  9. for(k = ; k < n; k++)
  10. {
  11. if(dis[j][k] > dis[j][i] + dis[i][k])
  12. dis[j][k] = dis[j][i] + dis[i][k];
  13. }
  14. }
  15. int main()
  16. {
  17. int i, j;
  18. while(~scanf("%d%d", &n, &m))
  19. {
  20. for(i = ; i < n; i++)
  21. for(j = ; j < n; j++)
  22. {
  23. if(i == j)
  24. dis[i][j] = ;
  25. else
  26. dis[i][j] = inf;
  27. }
  28. while(m--)
  29. {
  30. int a, b;
  31. scanf("%d%d", &a, &b);
  32. dis[a][b] = dis[b][a] = ;
  33. }
  34. floyd();
  35. int flag = ;
  36. for(i = ; i < n; i++)
  37. {
  38. for(j = ; j < n; j++)
  39. if(dis[i][j] > )
  40. {
  41. flag = ;
  42. break;
  43. }
  44. if(!flag)
  45. {
  46. printf("No\n");
  47. break;
  48. }
  49. }
  50. if(flag)
  51. printf("Yes\n");
  52. }
  53. return ;
  54. }

hdoj 1869 六度分离的更多相关文章

  1. hdoj 1869 六度分离【最短路径求两两边之间最长边】

    六度分离 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  2. ACM: HDU 1869 六度分离-Dijkstra算法

    HDU 1869六度分离 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Descri ...

  3. hdu 1869 六度分离(最短路floyd)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1869 六度分离 Time Limit: 5000/1000 MS (Java/Others)    M ...

  4. HDU 1869 六度分离

    六度分离 http://acm.hdu.edu.cn/showproblem.php?pid=1869 Problem Description 1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一 ...

  5. HDU ACM 1869 六度分离(Floyd)

    六度分离 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  6. HDOJ 1869

    #include<stdio.h> ][]; #define inf 0xffffff; void floyed(int n) { int i,j,k; ;k<n;k++) { ;i ...

  7. HDU 1869 六度分离 最短路

    解题报告: 1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为“小世界现象(small world phenomenon)”的著名假说,大意是说,任何2个素不相识的人中间最多只隔着6个人, ...

  8. HDU - 1869 六度分离 Floyd多源最短路

    六度分离 1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为“小世界现象(small world phenomenon)”的著名假说,大意是说,任何2个素不相识的人中间最多只隔着6个人,即 ...

  9. HDU 1869 六度分离【floyd】

    题意:给出n个人,m个关系,问是否满足任意两个人之间的距离通过6个人就可以连接 用floyd就可以了,注意距离是大于7 #include<iostream> #include<cst ...

随机推荐

  1. Redis从基础命令到实战之散列类型(Hash)

    从上一篇的实例中可以看出,用字符串类型存储对象有一些不足,在存储/读取时需要进行序列化/反序列化,即时只想修改一项内容,如价格,也必须修改整个键值.不仅增大开发的复杂度,也增加了不必要的性能开销. 一 ...

  2. easyui combobox点击输入框弹出下拉框

    由于easyui combobox需要点击下拉箭头才能下拉,不能像select标签那样点击输入框就下拉,所以觉得不太方便,查看了一下,combobox弹出框是一个div,原本想在他的输入框的点击事件中 ...

  3. mssql2000 身份证号码验证

    CREATE VIEW thisDate --返回当前日期,因为自定义函数中不能使用GETDATE() AS ),) AS aDate )) /*mssql2000 返回值=0,身份证校验正确 1:位 ...

  4. log4net 记录日志到sqlserver

    参考:http://blog.csdn.net/niuyongjie/article/details/5777625 demo

  5. Begin :SWIFT 基本语法

    国内介绍IOS书籍大多是很陈旧的代码, 2014年Apple发布了Swift语言, 毫无疑问Swift是一个强大的语言, 但是纵观国内的IOS现状,大家大多已经习惯了了OC, OC能解决的问题谁会想到 ...

  6. JQuery动画效果

    jquery动画效果常用方法 1.show()显示效果语法:show(speed,callback)Number/String,Function speend为动画执行时间,单位为毫秒.也可以为slo ...

  7. map集合键值对存储,键值不重复,值可以重复

    import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; import java.util.Li ...

  8. python第十九天-----Django进阶

    1.机智的小django为我你们提供了快捷的表单验证! from django.shortcuts import render, HttpResponse,redirect from django i ...

  9. ANDROID调用webservice带soapheader验证

    最近的一个项目中调用webservice接口,需要验证soapheader,现将解决方法记录如下:(网上资料出处太多,就不做引用,原作者如看到,如有必要添加请通知) 1.先看接口 POST /webs ...

  10. linux RPM、YUM

    Linux 界的两大主流: RPM 与 DPKG distribution 代表 软件管理机制 使用指令 在线升级机制(指令) Red Hat/Fedora RPM rpm, rpmbuild YUM ...