用到的东西

  1. Floyd算法(不考虑路径的长度,只关心两点之间是否有通路,可用于求有向图的传递闭包)
  2. STL map中的count用法
  3. 利用dfs输出同一个圈内的名字

题意

题目中给出 n 的人的名字,m组关系,表示前者给后者打电话 。如果两个人互相打过电话(直接或者间接),那么这两个人在一个集合。现在要求出所有集合中的人,输出格式看输出实例。

思路

设d[ i ] [ j ] 表示 i 和 j 通话过,如果 d[ i ] [ j ] && d[ j ] [ i ] 那么说明 i 和 j 属于同一个集合。

d[ i ][ j ] = d[ i ][ j ] ||(d[ i ][ k ] && d[ k ][ j ] );

AC代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<climits>
  6. #include<cmath>
  7. #include<cstdlib>
  8. #include<vector>
  9. #include<set>
  10. #include<utility>
  11. #include<map>
  12. #include<string>
  13. using namespace std;
  14. const int maxn = 30;
  15. int n, m;
  16. string name1, name2;
  17. int d[maxn][maxn], vis[maxn];
  18. map<string, int> name_set;
  19. vector<string> namee;
  20. void dfs(int cur)
  21. {
  22. vis[cur] = 1;
  23. for(int i = 0; i < n; i++)
  24. {
  25. if(!vis[i] && d[cur][i] && d[i][cur])
  26. {
  27. cout << ", " << namee[i];
  28. dfs(i);
  29. }
  30. }
  31. }
  32. int main()
  33. {
  34. // freopen("input.txt", "r", stdin);
  35. // freopen("output.txt", "w", stdout);
  36. int cnt = 0;
  37. while(scanf("%d%d", &n, &m))
  38. {
  39. if(!n && !m) break;
  40. ++cnt;
  41. if(cnt != 1)
  42. cout << endl;
  43. name_set.clear();
  44. namee.clear();
  45. memset(d, 0, sizeof(d));
  46. int id = 0;
  47. for(int i = 0; i < m; i++)
  48. {
  49. cin >> name1 >> name2;
  50. if(!name_set.count(name1))
  51. name_set[name1] = id++, namee.push_back(name1);
  52. if(!name_set.count(name2))
  53. name_set[name2] = id++, namee.push_back(name2);
  54. d[name_set[name1]][name_set[name2]] = 1;
  55. }
  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. memset(vis, 0, sizeof(vis));
  61. cout << "Calling circles for data set " << cnt << ":" << endl;
  62. for(int i = 0; i < n; i++)
  63. {
  64. if(!vis[i])
  65. {
  66. cout << namee[i];
  67. dfs(i);
  68. cout << endl;
  69. }
  70. }
  71. }
  72. }

【Calling Circles UVA - 247 】【Floyd + dfs】的更多相关文章

  1. Calling Circles(UVa 247)(Floyd 算法)

    用Floyd算法求出传递闭包,然后用dfs求出每条连通分量.注意其中用到的几个小技巧: #include<cstdio> #include<iostream> #include ...

  2. UVA 247 电话圈(Floyd传递闭包+输出连通分量)

    电话圈 紫书P365 [题目链接]电话圈 [题目类型]Floyd传递闭包+输出连通分量 &题解: 原来floyd还可以这么用,再配合连通分量,简直牛逼. 我发现其实求联通分量也不难,就是for ...

  3. 【uva 247】Calling Circles(图论--Floyd 传递闭包+并查集 连通分量)

    题意:有N个人互相打了M次电话,请找出所有电话圈(Eg.a→b,b→c,c→d,d→a 就算一个电话圈)并输出.(N≤25,L≤25,注意输出格式) 解法:由于N比较小所有n^2或n^3的复杂度都没有 ...

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

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

  5. 洛谷 题解 UVA247 【电话圈 Calling Circles】

    [题意] 如果两个人互相打电话(直接或者间接),则说他们在同一个电话圈里.例如,\(a\)打给\(b\),\(b\)打给\(c\),\(c\)打给\(d\),\(d\)打给\(a\),则这四个人在同一 ...

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

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

  7. UVA - 247 Calling Circles Floyd判圈

    思路:利用的Floyd判圈,如果i能到j,j也能到i说明i和j在同一个圈里.每个人的名字可用map编号.最后DFS打印答案即可. AC代码 #include <cstdio> #inclu ...

  8. UVa 247 Calling Circles (DFS+Floyd)

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

  9. UVA 247 - Calling Circles (Floyd)

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

随机推荐

  1. 快速改变文件hash值的方法

    查看哈希值命令 Linux : md5sum + 文件名 $ md5sum .png fe5c3f5ef1d207bc1b646911b463c907 .png Windows : certutil ...

  2. Linux CentOS7 下无图形界面安装Oracle11G R2版本

    01,系统 Centos7 数据库版本 Oracle_11gR2 ,以及硬件要求 内存不能小于 1G,可用硬盘不小于8G Swap分区空间不小于2G grep MemTotal /proc/memin ...

  3. 量化编程技术—matplotlib与可视化

    import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d import Axes3D np.random ...

  4. 阿里云k8s事件监控

    事件监控是Kubernetes中的另一种监控方式,可以弥补资源监控在实时性.准确性和场景上的缺欠.Kubernetes的架构设计是基于状态机的,不同的状态之间进行转换则会生成相应的事件,正常的状态之间 ...

  5. 删除lvm时出现"Logical volume contains a filesystem in use"

    问题描述: k8s环境中需要重新创建lvm:/dev/mapper/test-vg-test-storage,该lvm挂载在/data/prometheus下面,在删除出现"Logical ...

  6. 处理html换行问题

    String.prototype.replaceAll = function (FindText, RepText) { regExp = new RegExp(FindText, "g&q ...

  7. Matlab 信号与系统课设 - BiRadio仿真电台

    BiRadio Matlab 信号与系统课设 - BiRadio仿真电台 Author : Benjamin142857 Date : 2018-12 Video : BiliBili Github ...

  8. 【EBS】菜单的复制脚本

    DECLARE l_error_flag ); l_menu_rowid ); l_menu_entity_rowid ); l_menu_id NUMBER; l_cnt ; c_new_menu_ ...

  9. git 学习笔记 --从远程库克隆

    上次我们讲了先有本地库,后有远程库的时候,如何关联远程库. 现在,假设我们从零开发,那么最好的方式是先创建远程库,然后,从远程库克隆. 首先,登陆GitHub,创建一个新的仓库,名字叫gitskill ...

  10. AOP & 拦截器

    https://www.cnblogs.com/boywwj/p/7502185.html spring aop中@after-returning和@after,@afterThrowing,@Aro ...