【Calling Circles UVA - 247 】【Floyd + dfs】
用到的东西
- Floyd算法(不考虑路径的长度,只关心两点之间是否有通路,可用于求有向图的传递闭包)
- STL map中的count用法
- 利用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代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cstdlib>
#include<vector>
#include<set>
#include<utility>
#include<map>
#include<string>
using namespace std;
const int maxn = 30;
int n, m;
string name1, name2;
int d[maxn][maxn], vis[maxn];
map<string, int> name_set;
vector<string> namee;
void dfs(int cur)
{
vis[cur] = 1;
for(int i = 0; i < n; i++)
{
if(!vis[i] && d[cur][i] && d[i][cur])
{
cout << ", " << namee[i];
dfs(i);
}
}
}
int main()
{
// freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
int cnt = 0;
while(scanf("%d%d", &n, &m))
{
if(!n && !m) break;
++cnt;
if(cnt != 1)
cout << endl;
name_set.clear();
namee.clear();
memset(d, 0, sizeof(d));
int id = 0;
for(int i = 0; i < m; i++)
{
cin >> name1 >> name2;
if(!name_set.count(name1))
name_set[name1] = id++, namee.push_back(name1);
if(!name_set.count(name2))
name_set[name2] = id++, namee.push_back(name2);
d[name_set[name1]][name_set[name2]] = 1;
}
for(int k = 0; k < n; k++)
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
d[i][j] = d[i][j] || (d[i][k] && d[k][j]);
memset(vis, 0, sizeof(vis));
cout << "Calling circles for data set " << cnt << ":" << endl;
for(int i = 0; i < n; i++)
{
if(!vis[i])
{
cout << namee[i];
dfs(i);
cout << endl;
}
}
}
}
【Calling Circles UVA - 247 】【Floyd + dfs】的更多相关文章
- Calling Circles(UVa 247)(Floyd 算法)
用Floyd算法求出传递闭包,然后用dfs求出每条连通分量.注意其中用到的几个小技巧: #include<cstdio> #include<iostream> #include ...
- UVA 247 电话圈(Floyd传递闭包+输出连通分量)
电话圈 紫书P365 [题目链接]电话圈 [题目类型]Floyd传递闭包+输出连通分量 &题解: 原来floyd还可以这么用,再配合连通分量,简直牛逼. 我发现其实求联通分量也不难,就是for ...
- 【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的复杂度都没有 ...
- UVa 247 Calling Circles【传递闭包】
题意:给出n个人的m次电话,问最后构成多少个环,找出所有的环 自己想的是:用map来储存人名,每个人名映射成一个数字编号,再用并查集,求出有多少块连通块,输出 可是map不熟,写不出来,而且用并查集输 ...
- 洛谷 题解 UVA247 【电话圈 Calling Circles】
[题意] 如果两个人互相打电话(直接或者间接),则说他们在同一个电话圈里.例如,\(a\)打给\(b\),\(b\)打给\(c\),\(c\)打给\(d\),\(d\)打给\(a\),则这四个人在同一 ...
- UVa 247 - Calling Circles(Floyd求有向图的传递闭包)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA - 247 Calling Circles Floyd判圈
思路:利用的Floyd判圈,如果i能到j,j也能到i说明i和j在同一个圈里.每个人的名字可用map编号.最后DFS打印答案即可. AC代码 #include <cstdio> #inclu ...
- UVa 247 Calling Circles (DFS+Floyd)
题意:如果两个人互通电话,那么他们就在一个电话圈里,现在给定 n 个人,并且给定 m 个通话记录,让你输出所有的电话圈. 析:刚开始没想到是Floyd算法,后来才知道是这个算法,利用这个算法进行连通性 ...
- UVA 247 - Calling Circles (Floyd)
互相可以打电话是一个传递关系,所以Floyd求传递封包,dfs找一个尽量大的圈. #include<bits/stdc++.h> using namespace std; ; map< ...
随机推荐
- Difference between LinkedList vs ArrayList in Java
source-url LinkedList implements it with a doubly-linked list. ArrayList implements it with a dynami ...
- zuul重连配置
#retry #该参数用来开启重试机制 spring.cloud.loadbalancer.retry.enabled=true #断路器的超时时间,断路器的超时时间需要大于ribbon的超时时间,不 ...
- 1.3 LVM条带化
1.什么是条带化 磁盘冲突:当多个进程同时访问一个磁盘时,可能会出现磁盘冲突.磁盘系统对访问次数(每秒的IOPS)和数据传输速率(读写速率,TPS)有限制.当达到这些限制时,后面需要访问磁盘的进程就需 ...
- strlen()与sizeof()
一.strlen() strlen()为计算字符串长度的函数,以‘\0’为字符串结束标志.注意:其传入参数必须是字符串指针(char*), 当传入的是数组名时,实际上数组退化成指针了. 二.sizeo ...
- day10——动态参数、函数注释、名称空间、函数的嵌套、global及nonlocal
day10 三元运算符: 变量 = 条件成立的结果 条件判断 条件不成立的结果 补充: # lst = [12,23,3,4,5,6] # def func(*args): # print(*args ...
- C语言基础知识---认识C语言
2019.11.09 秋风 晴 最近一直在搞一套LoRa算法.总算有点效果了.心感慰藉(可能用错词语.但是也不管了) 初学者如何理解C语言? 无需刻板理解,笔者常用一个这样的例子助学生理解:法国人和法 ...
- C语言指针的一些用法
指针是C语言的灵魂,精华之所在.指针强大而危险,用得好是一大利器,用得不好是一大潜在危害.正是指针具有强大而又危险的特性,加上指针比较难,很多人用的不好,所以越是封装程度高的语言,越是没有指针的&qu ...
- MNIST机器学习入门(一)
一.简介 首先介绍MNIST 数据集.如图1-1 所示, MNIST 数据集主要由一些手写数字的图片和相应的标签组成,图片一共有10 类,分别对应从0-9 ,共10 个阿拉伯数字. 原始的MNIST ...
- 【题解】Luogu P5342 [TJOI2019]甲苯先生的线段树
原题传送门 挺有趣的一道题 \(c=1\),暴力求出点权和n即可 \(c=2\),先像\(c=1\)一样暴力求出点权和n,考虑有多少路径点权和也为n 考虑设x为路径的转折点,\(L\)为\(x\)向左 ...
- 切换GCC编译器版本
当前版本信息 root@ubuntu:runninglinuxkernel_4.0# aarch64-linux-gnu-gcc -v Using built-in specs. COLLECT_GC ...