题意:有N个人互相打了M次电话,请找出所有电话圈(Eg.a→b,b→c,c→d,d→a 就算一个电话圈)并输出。(N≤25,L≤25,注意输出格式)

解法:由于N比较小所有n^2或n^3的复杂度都没有问题。所以就O(n^2)读入;O(n^3)Floyd算法求出传递闭包,d[i][j]表示 i 是否直接或间接给 j 打过电话,并查集并起一个电话圈里的人;O(n^2)输出。总的是O(n^3)的时间复杂度。

P.S.我的代码有点长~再补个连通分量和强连通分量的知识:连通分量——强连通图的连通分量为其本身。如果为非连通图,则连通分量为该图的最大连通子图;有向图强连通分量——在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通分量(strongly connected components)。

 1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<iostream>
5 using namespace std;
6
7 const int N=27,M=910;
8 int n,m,T=0;
9 int d[N][N],fa[N];
10 char s[N],ss[N],str[N][N];
11
12 void input()
13 {
14 int x,y,len=0;
15 memset(d,0,sizeof(d));
16 for (int i=1;i<=m;i++)
17 {
18 scanf("%s%s",s,ss);
19 x=y=0;
20 for (int j=1;j<=len;j++)
21 {
22 if (!strcmp(s,str[j])) x=j;
23 if (!strcmp(ss,str[j])) y=j;
24 }
25 if (!x) memcpy(str[++len],s,sizeof(s)),x=len;
26 if (!y) memcpy(str[++len],ss,sizeof(ss)),y=len;
27 d[x][y]=1;
28 }
29 }
30 int ffind(int x)
31 {
32 if (fa[x]!=x) fa[x]=ffind(fa[x]);
33 return fa[x];
34 }
35 void solve()
36 {
37 for (int k=1;k<=n;k++)
38 for (int i=1;i<=n;i++)
39 for (int j=1;j<=n;j++)
40 d[i][j]=d[i][j]|(d[i][k]&d[k][j]);
41
42 for (int i=1;i<=n;i++) fa[i]=i;
43 for (int i=1;i<=n;i++)
44 for (int j=1;j<=n;j++)
45 {
46 if (!d[i][j] || !d[j][i]) continue;
47 int fx=ffind(i),fy=ffind(j);
48 if (fx!=fy) fa[fx]=fy;
49 }
50 if (T) printf("\n");
51 printf("Calling circles for data set %d:\n",++T);
52 for (int i=1;i<=n;i++)
53 {
54 if (fa[i]!=i) continue;
55 printf("%s",str[i]);
56 for (int j=1;j<=n;j++)
57 if (fa[j]==i && i!=j) printf(", %s",str[j]);
58 printf("\n");
59 }
60 }
61 int main()
62 {
63 while (1)
64 {
65 scanf("%d%d",&n,&m);
66 if (!n && !m) break;
67 input();
68 solve();
69 }
70 return 0;
71 }

【uva 247】Calling Circles(图论--Floyd 传递闭包+并查集 连通分量)的更多相关文章

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

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

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

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

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

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

  4. UVA 247 - Calling Circles (Floyd)

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

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

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

  6. UVA - 247 Calling Circles Floyd判圈

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

  7. UVa 247 Calling Circles (DFS+Floyd)

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

  8. UVA 247 电话圈 (floyd传递闭包 + dfs输出连通分量的点)

    题意:输出所有的环: 思路:数据比较小,用三层循环的floyd传递闭包(即两条路通为1,不通为0,如果在一个环中,环中的所有点能互相连通),输出路径用dfs,递归还没有出现过的点(vis),输出并递归 ...

  9. UVa 247 电话圈(Floyd传递闭包)

    https://vjudge.net/problem/UVA-247 题意: 如果两个人相互打电话,则说他们在同一个电话圈里.例如,a打给b,b打给c,c打给d,d打给a,则这4个人在同一个圈里:如果 ...

随机推荐

  1. 【Java基础】集合

    集合 集合概述 一方面, 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象 的操作,就要对对象进行存储.另一方面,使用 Array 存储对象方面具有一些弊端,而 Java 集合就像一种容器 ...

  2. 在阿里云托管的k8s上使用nas做动态存储

    前言 关于aliyun托管k8s的存储插件主要有两种: CSI # kubectl get pod -n kube-system | grep csi-plugin csi-plugin-8bbnw ...

  3. 在Linux系统下限制指定目录的大小以及文件/文件夹数量

    背景说明 在Linux操作系统下有时需要限制一个指定文件夹的大小和文件夹内可存储的文件数量,有可能是出于安全的考量或者定制化的配置,这里我们提供了一种方案:用dd创建一个空的img镜像,进行格式化的配 ...

  4. selenium自动化 | 实现抢课功能

    # -*- coding: utf-8 -*-"""Created on Wed Jan 1 23:39:34 2020@author: billie程序运行环境要求:- ...

  5. spring boot gateway 过滤器的执行顺序

    前言 学习官方文档,发现对于过滤器有分为三类 默认过滤器 自定义过滤 全局过滤器 于是就有一个疑问,关于这些过滤器的访问顺序是怎样的,今天就以一个demo来进行测试 准备阶段 过滤器工厂类 以此为模板 ...

  6. MySQL 使用sql添加和创建用户

    用户管理 SQL 命令操作 用户表:mysql.user 本质:对mysql.user 表进行增删改查 -- ============== 用户管理 ============= -- 创建用户 -- ...

  7. mysql 需要内核级线程的支持,而不只是用户级线程,这样才能够有效的使用多个cpu

    mysql 需要内核级线程的支持,而不只是用户级线程,这样才能够有效的使用多个cpu

  8. 【MYSQL】MySQL5.6.37二进制安装

    最近有个项目要用到mysql 于是在mysql的论坛中找到了一个5.6.37版本的 下面介绍怎么安装和使用mysql 下载地址: https://dev.mysql.com/downloads/mys ...

  9. 白日梦的Elasticsearch实战笔记,32个查询案例、15个聚合案例、7个查询优化技巧。

    目录 一.导读 三._search api 搜索api 3.1.什么是query string search? 3.2.什么是query dsl? 3.3.干货!32个查询案例! 四.聚合分析 4.1 ...

  10. 使用remix实现给合约账户转账

    实现内容:从remix上的虚拟账户上转账给自己编写的智能合约账户 前提基础:对solidity有一些基础了解,对以太坊的账户机制有一定了解. 账户 在以太坊中账户的唯一标识是地址(address). ...