题意:问给定的一张图中,相距最远的两个点的距离为多少。
解法:跟求树的直径差不多,从1 开始bfs,得到一个最远的点,然后再从该点bfs一遍,得到的最长距离即为答案。

代码:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <cmath>
  6. #include <algorithm>
  7. #include <string>
  8. #include <vector>
  9. #include <queue>
  10. #include <map>
  11. using namespace std;
  12. #define N 100007
  13.  
  14. map<string,int> mp;
  15. vector<int> G[];
  16. int vis[],n,m,Maxdis,Maxtag;
  17. struct node{
  18. int dis,u;
  19. };
  20.  
  21. void dfs(int u)
  22. {
  23. vis[u] = ;
  24. for(int i=;i<G[u].size();i++)
  25. {
  26. int v = G[u][i];
  27. if(!vis[v]) dfs(v);
  28. }
  29. }
  30.  
  31. void bfs(int u)
  32. {
  33. queue<node> que;
  34. memset(vis,,sizeof(vis));
  35. node now;
  36. now.dis = ;
  37. now.u = u;
  38. que.push(now);
  39. vis[u] = ;
  40. while(!que.empty())
  41. {
  42. int SZ = que.size();
  43. while(SZ--)
  44. {
  45. node tmp = que.front();
  46. que.pop();
  47. int dis = tmp.dis;
  48. int u = tmp.u;
  49. if(dis > Maxdis)
  50. {
  51. Maxdis = dis;
  52. Maxtag = u;
  53. }
  54. for(int i=;i<G[u].size();i++)
  55. {
  56. int v = G[u][i];
  57. if(!vis[v])
  58. {
  59. now.u = v;
  60. now.dis = dis+;
  61. vis[v] = ;
  62. que.push(now);
  63. }
  64. }
  65. }
  66. }
  67. }
  68.  
  69. int main()
  70. {
  71. int i,j;
  72. string S;
  73. while(scanf("%d",&n)!=EOF && n)
  74. {
  75. mp.clear();
  76. for(i=;i<=n;i++)
  77. {
  78. cin>>S;
  79. mp[S] = i;
  80. G[i].clear();
  81. }
  82. scanf("%d",&m);
  83. string A,B;
  84. for(i=;i<=m;i++)
  85. {
  86. cin>>A>>B;
  87. int a = mp[A], b = mp[B];
  88. G[a].push_back(b);
  89. G[b].push_back(a);
  90. }
  91. memset(vis,,sizeof(vis));
  92. dfs();
  93. int Link = ;
  94. for(i=;i<=n;i++)
  95. if(!vis[i]) Link = ;
  96. if(!Link)
  97. {
  98. puts("-1");
  99. continue;
  100. }
  101. Maxdis = , Maxtag = -;
  102. bfs();
  103. int S = Maxtag;
  104. Maxdis = , Maxtag = -;
  105. bfs(S);
  106. printf("%d\n",Maxdis);
  107. }
  108. return ;
  109. }

HDU 4460 Friend Chains --BFS的更多相关文章

  1. HDU 4460 Friend Chains (BFS,最长路径)

    题意:给定 n 个人,和关系,问你这个朋友圈里任意两者之间最短的距离是多少. 析:很明显的一个BFS,只要去找最长距离就好.如果不能全找到,就是-1. 代码如下: #pragma comment(li ...

  2. HDU 4460 Friend Chains(map + spfa)

    Friend Chains Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total ...

  3. HDU 4460 Friend Chains

    Problem Description For a group of people, there is an idea that everyone is equals to or less than ...

  4. HDU 1428 漫步校园 (BFS+优先队列+记忆化搜索)

    题目地址:HDU 1428 先用BFS+优先队列求出全部点到机房的最短距离.然后用记忆化搜索去搜. 代码例如以下: #include <iostream> #include <str ...

  5. hdu 4460 第37届ACM/ICPC杭州赛区H题 STL+bfs

    题意:一些小伙伴之间有朋友关系,比如a和b是朋友,b和c是朋友,a和c不是朋友,则a和c之间存在朋友链,且大小为2,给出一些关系,求出这些关系中最大的链是多少? 求最短路的最大距离 #include& ...

  6. hdu 2102 A计划-bfs

    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

  7. HDU 1072(记忆化BFS)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1072 题目大意:走迷宫.走到装置点重置时间,到达任一点时的时间不能为0,可以走重复路,求出迷宫最短时 ...

  8. HDU 2364 (记忆化BFS搜索)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2364 题目大意:走迷宫.从某个方向进入某点,优先走左或是右.如果左右都走不通,再考虑向前.绝对不能往 ...

  9. HDU 2579 (记忆化BFS搜索)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2579 题目大意:走迷宫.对于障碍点,只有当前(dep+1)%k才能走,问最少时间. 解题思路: 只有 ...

随机推荐

  1. 内存分段 && 缓冲区 && 析构函数

    一.内存中的程序: 在进程被载入内存中时,基本上被分成许多小的节,以下是6个主要的节. 低地址                                                   高地 ...

  2. javascript 之正则匹配HTML

    正则表达式 <(\S*?) [^>]*>.*?</\1>|<.*? /> 匹配 <html>hello</html>|<a> ...

  3. 【Asphyre引擎】学习笔记(二)

    转一篇火人论坛那边的一份学习文档,我简单排一下版,希望对入门者有帮助. 感谢China Yang,这份文档也帮助我快速入了门. 和我一起学 Asphyre Sphinx Framework v1.0. ...

  4. 移除NDK方法

    以下内容由:于伟建 提供 删除.project中的以下字段基本都是有cdt关键字的位置 删除.cproject然后重启eclipse,clean,重新编译我这里还有错误,就手动删了gen 删除包含cd ...

  5. git学习笔记2

    工作区和暂存区 Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念. 先来看名词解释. 工作区(Working Directory) 就是你在电脑里能看到的目录,比如我的github文件 ...

  6. 自己使用 1.C语言历史以及特点。

    1. C语言的发展及特点? C在1969--1973年间与Unix操作系统同时诞生:最富创造性的时期是1972年.另一次大的变化发生在1977到1979年间,当Unix系统的可移植性得到证明时.在后一 ...

  7. iOS开发--隐藏(去除)导航栏底部横线

    iOS开发大部分情况下会使用到导航栏,由于我司的app导航栏需要与下面紧挨着的窗口颜色一致,导航栏底部的横线就会影响这个美观,LZ使用了以下方法.觉得不错,分享来给小伙伴们. 1)声明UIImageV ...

  8. 实验:传输层:UDP协议 学习笔记

    一.传输层协议 从之前介绍的网络层协议来看,通信的两端是两台主机,IP数据报首部就标明了这两台主机的IP地址.但是从传输层来看,是发送方主机中的一个进程与接收方主机中的一个进程在交换数据,因此,严格地 ...

  9. myeclipse2013 安装 egit

    myeclipse2013版本: Version: 2013 Build id: 11.0-20130401     手工安装不了,那就到市场上安装.     1.Help--->Install ...

  10. 大家一起和snailren学java-(四)初始化与清理

    初始化和清理,是一个生命周期的起始.在java中,对象的初始化和对象的回收是怎样的呢? 在开发c++的时候,有构造器的概念.即对象的创建,首先默认调用构造器进行初始化.在java中也有“构造器”.ja ...