思路:利用的Floyd判圈,如果i能到j,j也能到i说明i和j在同一个圈里。每个人的名字可用map编号。最后DFS打印答案即可。

AC代码

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <utility>
  6. #include <string>
  7. #include <iostream>
  8. #include <map>
  9. #include <set>
  10. #include <vector>
  11. #include <queue>
  12. #include <stack>
  13. using namespace std;
  14. #pragma comment(linker, "/STACK:1024000000,1024000000")
  15. #define eps 1e-10
  16. #define inf 0x3f3f3f3f
  17. #define PI pair<int, int>
  18. typedef long long LL;
  19. const int maxn = 25 + 5;
  20. int d[maxn][maxn];
  21. int cur, n, m;
  22. map<string, int>Hash;
  23. string name[maxn];
  24. int get_ID(string &p) {
  25. if(!Hash.count(p)) {
  26. name[cur] = p;
  27. Hash[p] = cur++;
  28. }
  29. return Hash[p];
  30. }
  31.  
  32. bool vis[maxn];
  33. void dfs(int u){ //dfs求联通分量
  34. vis[u] = true;
  35. for(int i = 0; i < n; ++i) {
  36. if(vis[i] || !d[u][i] || !d[i][u]) continue;
  37. cout << ", " << name[i];
  38. vis[i] = true;
  39. dfs(i);
  40. }
  41. }
  42. int main() {
  43. int kase = 0;
  44. while(scanf("%d%d", &n, &m) == 2 && n && m) {
  45. Hash.clear();
  46. if(kase++) printf("\n");
  47. cur = 0;
  48. memset(d, 0, sizeof(d));
  49. string x, y;
  50. for(int i = 0; i < m; ++i) {
  51. cin >> x >> y;
  52. int a = get_ID(x), b = get_ID(y);
  53. d[a][b] = 1;
  54. }
  55. //floyd
  56. for(int k = 0; k < n; ++k)
  57. for(int i = 0; i < n; ++i)
  58. for(int j = 0; j < n; ++j)
  59. d[i][j] = d[i][j] || (d[i][k] && d[k][j]);
  60.  
  61. memset(vis, false, sizeof(vis));
  62. printf("Calling circles for data set %d:\n", kase);
  63. for(int i = 0; i < n; ++i) {
  64. if(vis[i]) continue;
  65. cout << name[i];
  66. dfs(i);
  67. printf("\n");
  68. }
  69. }
  70. return 0;
  71. }

如有不当之处欢迎指出!

UVA - 247 Calling Circles Floyd判圈的更多相关文章

  1. UVA 11549 Calculator Conundrum (Floyd判圈算法)

    题意:有个老式计算器,每次只能记住一个数字的前n位.现在输入一个整数k,然后反复平方,一直做下去,能得到的最大数是多少.例如,n=1,k=6,那么一次显示:6,3,9,1... 思路:这个题一定会出现 ...

  2. UVa 247 - Calling Circles(Floyd求有向图的传递闭包)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  3. UVa 247 Calling Circles (DFS+Floyd)

    题意:如果两个人互通电话,那么他们就在一个电话圈里,现在给定 n 个人,并且给定 m 个通话记录,让你输出所有的电话圈. 析:刚开始没想到是Floyd算法,后来才知道是这个算法,利用这个算法进行连通性 ...

  4. UVA 247 - Calling Circles (Floyd)

    互相可以打电话是一个传递关系,所以Floyd求传递封包,dfs找一个尽量大的圈. #include<bits/stdc++.h> using namespace std; ; map< ...

  5. UVA - 247 Calling Circles(Floyd求传递闭包)

    题目: 思路: 利用Floyd求传递闭包(mp[i][j] = mp[i][j]||(mp[i][k]&&mp[k][j]);),当mp[i][j]=1&&mp[j][ ...

  6. UVA 247"Calling Circles"(floyd求传递闭包+SCC)

    传送门 题意: 如果两个人相互打电话(直接或间接),则说他们在同一个电话圈里. (a,b) 表示 a 打给 b: 例如,(a,b),(b,c),(c,d),(d,a),则这四个人在同一个电话圈里: 输 ...

  7. UVA 247 Calling Circles —— (强连通分量模板题)

    第一个强连通分量的题. 题意:有一堆人,a给b打电话表示a有一条向b的边,一个强连通分量代表一个电话圈,把每个电话圈里的人在一行内输出出来. 直接上模板即可,但是要注意把string用map映射一下的 ...

  8. UVa 247 Calling Circles【传递闭包】

    题意:给出n个人的m次电话,问最后构成多少个环,找出所有的环 自己想的是:用map来储存人名,每个人名映射成一个数字编号,再用并查集,求出有多少块连通块,输出 可是map不熟,写不出来,而且用并查集输 ...

  9. Floyd判圈算法 UVA 11549 - Calculator Conundrum

    题意:给定一个数k,每次计算k的平方,然后截取最高的n位,然后不断重复这两个步骤,问这样可以得到的最大的数是多少? Floyd判圈算法:这个算法用在循环问题中,例如这个题目中,在不断重复中,一定有一个 ...

随机推荐

  1. 数据仓库搭建——Inmon与Kimball

    一.简介 1.1 历史 搞数据仓库这么久,实践中发现首先搭建数据集市,还是清洗数据之后,直接进入数据立方体(形成维度表和实施表)形成核心数据仓库层,是个选择题... 随后发现这其实涉及到了数据仓库的历 ...

  2. 仿百度糯米TP5项目笔记

    需求分析 系统三大模块 商家平台.主平台.前台模块 Thinkphp5.0实战 仿百度糯米开发多商家电商平台网盘下载 (2017-04-24 01:46:23) 转载▼     第1章 课程简介 本章 ...

  3. 让Python支持中文注释

    在第一行中加入如下行即可,表示文件的编码: #coding=utf-8 或 #coding=gbk

  4. GTID复制详解

    前言 GTID复制是MySQL 5.6后的新功能,在传统的方式里,主从切换后,需要找到binlog和POS点,然后执行命令change master to 指向新的主库.对于不是很有经验的人来说,往往 ...

  5. 《.NET 设计规范》第 6 章:扩展性设计

    第 6 章:扩展性设计 6.1 扩展机制 考虑用不包含任何虚成员或受保护的成员的非密封类来为框架提供扩展性.这种方法所提供的扩展性广受用户欢迎,而且它的开销也不高. 考虑将受保护的成员用于高级的定制方 ...

  6. Electron应用使用electron-builder配合electron-updater实现自动更新(windows + mac)

    发客户端一定要做的就是自动更新模块,否则每次版本升级都是一个头疼的事.下面是Electron应用使用electron-builder配合electron-updater实现自动更新的解决方案. 1.安 ...

  7. [DeeplearningAI笔记]改善深层神经网络_深度学习的实用层面1.9_归一化normalization

    觉得有用的话,欢迎一起讨论相互学习~Follow Me 1.9 归一化Normaliation 训练神经网络,其中一个加速训练的方法就是归一化输入(normalize inputs). 假设我们有一个 ...

  8. python字符串常用内置方法

    python字符串常用内置方法 定义: 字符串是一个有序的字符的集合,用与存储和表示基本的文本信息. python中引号中间包含的就是字符串. # s1='hello world' # s2=&quo ...

  9. xBIM 应用与学习 (一)

    目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...

  10. MySQL实现差集(Minus)和交集(Intersect)

    原文链接: http://www.linuxidc.com/Linux/2014-06/103551.htm MySQL没有实现Minus和Intersect功能,就像它也没有实现cube的功能一样. ...