传送门

题意:

  如果两个人相互打电话(直接或间接),则说他们在同一个电话圈里。

  (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)的更多相关文章

  1. UVA - 247 Calling Circles Floyd判圈

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

  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求有向图的传递闭包)

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

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

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

  5. UVA 247 - Calling Circles (Floyd)

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

  6. UVa 247 Calling Circles (DFS+Floyd)

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

  7. UVA 247 Calling Circles —— (强连通分量模板题)

    第一个强连通分量的题. 题意:有一堆人,a给b打电话表示a有一条向b的边,一个强连通分量代表一个电话圈,把每个电话圈里的人在一行内输出出来. 直接上模板即可,但是要注意把string用map映射一下的 ...

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

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

  9. UVA 247 电话圈(Floyd传递闭包+输出连通分量)

    电话圈 紫书P365 [题目链接]电话圈 [题目类型]Floyd传递闭包+输出连通分量 &题解: 原来floyd还可以这么用,再配合连通分量,简直牛逼. 我发现其实求联通分量也不难,就是for ...

随机推荐

  1. CSS3--关于z-index不生效问题

    最近写CSS3和js结合,遇到了很多次z-index不生效的情况: 1.在用z-index的时候,该元素没有定位(static定位除外) 2.在有定位的情况下,该元素的z-index没有生效,是因为该 ...

  2. scroll 滚动到指定位置触发事件 and 点击一按钮/链接让页面定位在指定的位置

    scroll 滚动到指定位置触发事件:$(function(){ $(window).scroll(function() { var s =$(window).scrollTop(); if (s&g ...

  3. 第一次作业:reading and prepare

    这个作业属于哪个课程 课程的链接 这个作业要求在哪里 作业要求的链接 我在这个课程的目标是 理解软件开发流程,更好的开发自己的软件 这个作业在哪个具体方面帮助我实现目标 对"工程" ...

  4. Mac查看Python安装路径和版本

    目录 #查看当前所有Python版本路径 appledeMBP:~ apple$ which python2.7 /usr/local/bin/python2.7 appledeMBP:~ apple ...

  5. 微信公众号系统在Linux下的部署操作

    ps -ef | grep tomcat 查看tomcat进程

  6. matlab 单元最短路 Dijkstra算法 无向图

    W = [2 8 1 1 6 5 1 2 3 6 4 9 3 7 9]; S = [0 0 0 1 1 3 3 3 5 5 6 4 6 2 2];S=S+1; T = [1 3 2 4 3 4 5 6 ...

  7. hdu2041 dp

    #include<stdio.h> int main() { int i,t,n; ]; dp[]=; dp[]=; dp[]=; ;i<=;i++) dp[i]=dp[i-]+dp ...

  8. 2019-8-31-C#-通过-probing-指定-dll-寻找文件夹

    title author date CreateTime categories C# 通过 probing 指定 dll 寻找文件夹 lindexi 2019-08-31 16:55:58 +0800 ...

  9. CNN对位移、尺度和旋转不变性的讨论

    CNN得益于全局共享权值和pool操作,具有平移不变性. 对于尺度不变性,是没有或者说具有一定的不变性(尺度变化不大),实验中小目标的检测是难点,需要采用FPN或者其他的方式单独处理. 对于旋转不变性 ...

  10. Maven启用代理访问

    如果你的公司正在建立一个防火墙,并使用HTTP代理服务器来阻止用户直接连接到互联网.如果您使用代理,Maven将无法下载任何依赖. 为了使它工作,你必须声明在 Maven 的配置文件中设置代理服务器: ...