UVA 247"Calling Circles"(floyd求传递闭包+SCC)
题意:
如果两个人相互打电话(直接或间接),则说他们在同一个电话圈里。
(a,b) 表示 a 打给 b;
例如,(a,b),(b,c),(c,d),(d,a),则这四个人在同一个电话圈里;
输入 n(n≤25) 个人的 m 次电话,找出所有的电话圈,输出每个电话圈里的人名(无序)。
题解:
首先用floyd求出传递闭包,构造新图;
然后在新图上跑一遍SCC求解;
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define memF(a,b,n) for(int i=0;i <= n;a[i]=b,++i);
const int maxn=; int n,m;
int num;
int head[maxn];
struct Edge
{
int to;
int next;
}G[maxn*maxn*];
void addEdge(int u,int v)
{
G[num]={v,head[u]};
head[u]=num++;
}
map<string ,int >f;
map<int ,string >g;
bitset<maxn>_bit[maxn];
int col[maxn];
struct SCC
{
vector<int >vs;
bool vis[maxn];
void DFS(int u)
{
vis[u]=true;
for(int i=head[u];~i;i=G[i].next)
{
int v=G[i].to;
if(vis[v] || (i&))
continue;
DFS(v);
}
vs.push_back(u);
}
void RDFS(int u,int k)
{
vis[u]=true;
col[u]=k;
for(int i=head[u];~i;i=G[i].next)
{
int v=G[i].to;
if(vis[v] || !(i&))
continue;
RDFS(v,k);
}
}
void scc()
{
vs.clear();
memF(vis,false,n);
for(int i=;i <= n;++i)
if(!vis[i])
DFS(i); memF(vis,false,n);
int k=;
for(int i=vs.size()-;i >= ;--i)
if(!vis[vs[i]])
RDFS(vs[i],++k);
}
}_scc;
vector<int >vs[maxn];
void Solve()
{
for(int i=;i <= n;++i)///传递闭包
for(int j=;j <= n;++j)
if(_bit[j][i])
_bit[j] |= _bit[i];
for(int i=;i <= n;++i)///构图
for(int j=;j <= n;++j)
if(_bit[i][j])
{
addEdge(i,j);
addEdge(j,i);
}
_scc.scc();
for(int i=;i <= n;++i)
vs[i].clear();
for(int i=;i <= n;++i)
vs[col[i]].push_back(i); for(int i=;i <= n;++i)
{
bool flag=false;
for(int j=;j < vs[i].size();++j)
{
if(!flag)
{
cout<<g[vs[i][j]];
flag=true;
}
else
cout<<", "<<g[vs[i][j]];
}
if(flag)
printf("\n");
}
}
void Init()
{
num=;
memF(head,-,n);
f.clear();
g.clear();
for(int i=;i <= n;++i)
_bit[i].reset();
}
int main()
{
// freopen("C:\\Users\\hyacinthLJP\\Desktop\\in&&out\\contest","r",stdin);
bool flag=false;
int kase=;
while(~scanf("%d%d",&n,&m) && n+m)
{
Init();
int k=;
for(int i=;i <= m;++i)
{
string s1,s2;
cin>>s1>>s2;
if(!f.count(s1))
{
f[s1]=++k;
g[k]=s1;
}
if(!f.count(s2))
{
f[s2]=++k;
g[k]=s2;
}
_bit[f[s1]].set(f[s2]);
}
if(flag)
printf("\n");
flag=true;
printf("Calling circles for data set %d:\n",++kase);
Solve();
}
return ;
}
UVA 247"Calling Circles"(floyd求传递闭包+SCC)的更多相关文章
- UVA - 247 Calling Circles Floyd判圈
思路:利用的Floyd判圈,如果i能到j,j也能到i说明i和j在同一个圈里.每个人的名字可用map编号.最后DFS打印答案即可. AC代码 #include <cstdio> #inclu ...
- UVA - 247 Calling Circles(Floyd求传递闭包)
题目: 思路: 利用Floyd求传递闭包(mp[i][j] = mp[i][j]||(mp[i][k]&&mp[k][j]);),当mp[i][j]=1&&mp[j][ ...
- UVa 247 - Calling Circles(Floyd求有向图的传递闭包)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVa 247 Calling Circles【传递闭包】
题意:给出n个人的m次电话,问最后构成多少个环,找出所有的环 自己想的是:用map来储存人名,每个人名映射成一个数字编号,再用并查集,求出有多少块连通块,输出 可是map不熟,写不出来,而且用并查集输 ...
- UVA 247 - Calling Circles (Floyd)
互相可以打电话是一个传递关系,所以Floyd求传递封包,dfs找一个尽量大的圈. #include<bits/stdc++.h> using namespace std; ; map< ...
- UVa 247 Calling Circles (DFS+Floyd)
题意:如果两个人互通电话,那么他们就在一个电话圈里,现在给定 n 个人,并且给定 m 个通话记录,让你输出所有的电话圈. 析:刚开始没想到是Floyd算法,后来才知道是这个算法,利用这个算法进行连通性 ...
- UVA 247 Calling Circles —— (强连通分量模板题)
第一个强连通分量的题. 题意:有一堆人,a给b打电话表示a有一条向b的边,一个强连通分量代表一个电话圈,把每个电话圈里的人在一行内输出出来. 直接上模板即可,但是要注意把string用map映射一下的 ...
- 【Calling Circles UVA - 247 】【Floyd + dfs】
用到的东西 Floyd算法(不考虑路径的长度,只关心两点之间是否有通路,可用于求有向图的传递闭包) STL map中的count用法 利用dfs输出同一个圈内的名字 题意 题目中给出 n 的人的名字, ...
- UVA 247 电话圈(Floyd传递闭包+输出连通分量)
电话圈 紫书P365 [题目链接]电话圈 [题目类型]Floyd传递闭包+输出连通分量 &题解: 原来floyd还可以这么用,再配合连通分量,简直牛逼. 我发现其实求联通分量也不难,就是for ...
随机推荐
- 【POJ 3294】Life Forms
[链接]h在这里写链接 [题意] 给你n个字符串. 让你找最长的字符串s; 这个s在超过一半的子串里面都有出现过且长度大于n/2; 如果有多个,输出多行. (按字典序输出) 也没说会不会出现大写. [ ...
- 公司电脑安装mysql出现小问题
按步骤将mysql安装好后,在自己电脑完全没问题,但是在公司电脑安装的时候出现了这样的问题. 查阅资料以后,找到了问题: 参考链接:https://blog.csdn.net/huacode/arti ...
- Directx11教程(67) 显示模型文件
原文:Directx11教程(67) 显示模型文件 在前面的教程中,我们都是通过在ModelClass中直接产生顶点和索引数据,简单的三角形,立方体等等还好说,毕竟比较简单,如何显示复杂的 ...
- C#字符串与 byte数据的互相转换
string和byte[]的转换 (C#) string类型转成byte[]: byte[] byteArray = System.Text.Encoding.Default.GetBytes ( s ...
- 五.获得MYSQL数据库自动生成的主键
测试脚本如下: 1 create table test1 2 ( 3 id int primary key auto_increment, 4 name varchar(20) 5 ); 测试代码: ...
- 生成主键ID,唯一键id,分布式ID生成器雪花算法代码实现
工具类: package com.ihrm.common.utils; import java.lang.management.ManagementFactory; import java.net. ...
- eclipse Some projects cannot be imported because they already exist in the workspace
archive file 档案文件 删除对应的文件即可
- VelocityTracker监控速度!!!
用来追踪触摸事件(flinging事件和其他手势事件)的速率.用obtain()函数来获得类的实例,用addMovement(MotionEvent)函数将motion event加入到Velocit ...
- 【NS2】NS2机制浅显分析一下(转载)
[我在之前看的是以ping协议为实例来理解TclCL机制和分裂对象模型] 本文以channel实例的创建过程为例,试图说明ns2的分裂机制,请在阅读本文前阅读<The NS Manual> ...
- Java练习 SDUT-1588_圆的面积
圆的面积 Time Limit: 1000 ms Memory Limit: 32768 KiB Problem Description Give you the radius of a circle ...