题意:

有n个人m通电话,如果有两个人相互打电话(直接或间接)则在同一个电话圈里。输出所有电话圈的人的名单。

分析:

根据打电话的关系,可以建一个有向图,然后用Warshall算法求传递闭包。

最后输出是辅助一个标记数组,用DFS输出的,这个办法挺巧妙的。

本来我原来的想法是,用并查集求所有的连通分量,然后再好多次循环找连通分量一致的名字输出,那样太麻烦了。

ios::sync_with_stdio(false);这个最好不要随便用,可能会产生某些副作用。

字符指针是可以传给string对象作参数的函数的,string对象有个c_str()函数返回一个字符指针,因此也可以用printf输出。

这样就避免了cin cout

 #include <cstdio>
#include <vector>
#include <string>
#include <cstring>
#include <iostream>
using namespace std; const int maxn = ;
int n;
bool R[maxn][maxn], vis[maxn];
char s1[], s2[];
vector<string> names; int ID(const string& s)
{
for(int i = ; i < names.size(); ++i)
if(names[i] == s) return i;
names.push_back(s);
return names.size() - ;
} void dfs(int u)
{
vis[u] = true;
for(int v = ; v < n; ++v)
if(!vis[v] && R[u][v] && R[v][u])
{
cout << ", " << names[v];
dfs(v);
}
} int main()
{
//freopen("in.txt", "r", stdin);
int kase = , m;
while(scanf("%d%d", &n, &m) == && n)
{
names.clear();
memset(R, false, sizeof(R));
if(kase) printf("\n");
printf("Calling circles for data set %d:\n", ++kase);
for(int i = ; i < n; ++i) R[i][i] = true;
for(int i = ; i < m; ++i)
{
scanf("%s%s", s1, s2);
R[ID(s1)][ID(s2)] = true;
}
for(int k = ; k < n; ++k)
for(int i = ; i < n; ++i)
for(int j = ; j < n; ++j)
R[i][j] |= R[i][k] && R[k][j];
memset(vis, false, sizeof(vis));
for(int i = ; i < n; ++i) if(!vis[i])
{
printf("%s", names[i].c_str());
dfs(i);
printf("\n");
}
} return ;
}

代码君

UVa 247 (传递闭包) Calling Circles的更多相关文章

  1. 【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的复杂度都没有 ...

  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【传递闭包】

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

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

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

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

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

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

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

  7. 【Calling Circles UVA - 247 】【Floyd + dfs】

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

  8. UVA - 247 Calling Circles Floyd判圈

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

  9. UVa 247 Calling Circles (DFS+Floyd)

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

随机推荐

  1. oracle分页与rownum

    Oracle分页(limit方式的运用) Oracle不支持类似于 MySQL 中的 limit. 但你还是可以rownum来限制返回的结果集的行数. 第一种 select * from a_matr ...

  2. Linux远程备份—ftp方式、NFS方式

    问题:现在项目中每天都有从其它各个系统发过来的数据文件(存放在/var/data目录下,以.txt结尾),虽然很久以前的文件很少用到,占用了很多空间,却不能删除.于是,想把一个月以前的文件都压缩了传到 ...

  3. Determining IP information for eth0… failed; no link present. Check cable

    [root@hexuweb101 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0添加下面代码: check_link_down () { return ...

  4. 统一iOS客户端和服务器端认证

    最近公司的同事业余时间搞了一个内部的类about.me(https://about.me/)的网站Ocelots,想来是一个很洋气的注意,以后跟客户介绍公司的时候,直接登录该网站,谈到谁的时候,就打开 ...

  5. easy ui 表单ajax和from两种提交数据方法

    说明: ①ajax在表单提交时需要将所有表单的控件的数据一一获取并赋值传到后台 ②form在提交时,只要给控件加name属性,在提交时就可以将表单数据提交到后台,不需要一一获取再进行赋值. ajax ...

  6. SPOJ 4487 Splay 基本操作

    插入操作,删除操作和置换操作都是单点的,所以不需要lazy标记.这个很简单,都是两次RotateTo,一次Splay操作就搞定. 求最大连续字段和的操作和线段树的题目类似,只需要保存最左边的连续最大字 ...

  7. .net sql connection pool leak

    Timeout expired.  The timeout period elapsed prior to obtaining a connection from the pool.  This ma ...

  8. spring dataSourceRouter自动切换数据源

    spring多数据源的切换,主要用到的是AbstractRoutingDataSource这个路由类,当我们的自定义的一个路由分发类继承AbstractRoutingDataSource类后,重写de ...

  9. css3实现非矩形图片效果

    经常在网站上看到有一些非矩形的图片展示.在以前可能我会毫不犹豫的直接放上张处理好的图片.但是这样的话确实有些不太友好.每每需要换图的时候,都要去开图像处理软件也是蛮拼的.自从有了css3的选装,妈妈就 ...

  10. bzoj 1228: [SDOI2009]E&D 阿达马矩阵

    1228: [SDOI2009]E&D Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 448  Solved: 240[Submit][Sta ...