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 ...
随机推荐
- 【JZOJ4744】【NOIP2016提高A组模拟9.2】同余
题目描述 输入 输出 样例输入 5 2 1 5 2 3 7 1 3 2 1 2 5 3 0 样例输出 2 1 数据范围 解法 题目允许离线,且没有修改操作. 考虑把一个询问拆分成两个形如"a ...
- day40-Spring 02-事务的回顾
- python 自主控制异常:用户自定义异常
- python 文本文件的写入
- Gym - 101962B_Color Changing Sofa
题意:将一个沙发放到一个分成好几个色块(一个字母代表一种颜色)的房间里,要求沙发染成跟所在色块一样的颜色,沙发分成(0,1)两种,0可以染成一种颜色,1可以染成一种颜色(换句话说,沙发最多两种颜色), ...
- HDU_2035:人见人爱A^B
Problem Description 求A^B的最后三位数表示的整数. 说明:A^B的含义是“A的B次方” Input 输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1< ...
- dva与create-react-app的结合使用
dva与我们的create-react-app创建的两款脚手架是我们写react项目的两款优秀框架,之前一种使用create-react-app这款脚手架进行开发.然后这个框架美中不足的是redux方 ...
- Plupload的上传机制
plupload支持多文件上传.经过测试发现,plupload在上传多个文件时,会把多个文件拆分成单个的一个一个上传.
- 2019-8-31-dotnet-使用-lz4net-压缩-Stream-或文件
title author date CreateTime categories dotnet 使用 lz4net 压缩 Stream 或文件 lindexi 2019-08-31 16:55:58 + ...
- 补充:css制作三角
梯形图案看下面这段样式: .test{width:10px; height:10px; border:10px solid; border-color:#ff3300 #0000ff #339966 ...