hihoCoder #1190 : 连通性·四(点的双连通分量模板)
描述
小Hi和小Ho从约翰家回到学校时,网络所的老师又找到了小Hi和小Ho。
老师告诉小Hi和小Ho:之前的分组出了点问题,当服务器(上次是连接)发生宕机的时候,在同一组的服务器有可能连接不上,所以他们希望重新进行一次分组。这一次老师希望对连接进行分组,并把一个组内的所有连接关联的服务器也视为这个组内的服务器(注意一个服务器可能属于多个组)。
这一次的条件是对于同一个组满足:当组内任意一个服务器宕机之后,不会影响组内其他服务器的连通性。在满足以上条件下,每个组内的边数量越多越好。
比如下面这个例子,一共有6个服务器和7条连接:

其中包含3个组,分别为{(1,2),(2,3),(3,1)},{(4,5),(5,6),(4,6)},{(3,4)}。对{(1,2),(2,3),(3,1)}而言,和该组边相关联的有{1,2,3}三个服务器:当1宕机后,仍然有2-3可以连接2和3;当2宕机后,仍然有1-3可以连接1和3;当3宕机后,仍然有1-2可以连接1和2。

老师把整个网络的情况告诉了小Hi和小Ho,希望小Hi和小Ho统计一下一共有多少个分组。
输入
第1行:2个正整数,N,M。表示点的数量N,边的数量M。1≤N≤20,000, 1≤M≤100,000
第2..M+1行:2个正整数,u,v。第i+1行表示存在一条边(u,v),编号为i,连接了u,v两台服务器。1≤u<v≤N
保证输入所有点之间至少有一条连通路径。
输出
第1行:1个整数,表示该网络的连接组数。
第2行:M个整数,第i个数表示第i条连接所属组内,编号最小的连接的编号。比如分为{(1,2)[1],(2,3)[3],(3,1)[2]},{(4,5)[5],(5,6)[7],(4,6)[6]},{(3,4)[4]},方括号内表示编号,则输出{1,1,1,4,5,5,5}。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<stack>
#include<algorithm>
using namespace std;
const int N=2e4+; //最大点数
const int M=1e5+; //最大边数 struct node{
int id,to;
node(int id,int to):id(id),to(to){}
};
vector<node>v[N];
stack<int>sk;
int cnt,num;
int low[N],dfn[N],fa[M],mp[M];
//fa[i]为第i条边所属的点双连通分量编号
//mp[i]为编号为i的点双连通分量里编号最小的编号
//一定注意fa和mp的范围是边数的范围M,不是点数范围N
void tarjan(int u,int f){
low[u]=dfn[u]=++cnt;
for(int i=;i<v[u].size();i++){
int t=v[u][i].to;
int id=v[u][i].id;
if(t==f) continue;
if(!dfn[t]){ //树边
sk.push(id); //边入栈
tarjan(t,u);
low[u]=min(low[u],low[t]);
if(dfn[u]<=low[t]){
num++;
while(!sk.empty()){
int cur=sk.top();
sk.pop();
fa[cur]=num;
if(mp[num]==||mp[num]>cur)
mp[num]=cur;
if(cur==id) break;
}
}
}
else if(dfn[t]<dfn[u]){//回边
low[u]=min(low[u],dfn[t]);
sk.push(id); //边入栈
}
}
} int main(){
int n,m;
scanf("%d%d",&n,&m);;
for(int i=;i<=m;i++){
int a,b;
scanf("%d%d",&a,&b);
v[a].push_back(node(i,b));
v[b].push_back(node(i,a));
}
tarjan(,-);
printf("%d\n",num);
for(int i=;i<=m;i++){
printf("%d%c",mp[fa[i]],i==m?'\n':' ');
}
return ;
}
hihoCoder #1190 : 连通性·四(点的双连通分量模板)的更多相关文章
- hihoCoder 1184 连通性二·边的双连通分量
		
#1184 : 连通性二·边的双连通分量 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在基本的网络搭建完成后,学校为了方便管理还需要对所有的服务器进行编组,网络所的老 ...
 - hihoCoder  #1184 : 连通性二·边的双连通分量(边的双连通分量模板)
		
#1184 : 连通性二·边的双连通分量 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在基本的网络搭建完成后,学校为了方便管理还需要对所有的服务器进行编组,网络所的老 ...
 - hihocoder #1190 : 连通性·四  点双联通分量
		
http://hihocoder.com/problemset/problem/1190?sid=1051696 先抄袭一下 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描 ...
 - HihoCoder 1190连通性·四
		
连通性·四 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho从约翰家回到学校时,网络所的老师又找到了小Hi和小Ho. 老师告诉小Hi和小Ho:之前的分组出了 ...
 - HohoCoder 1184 : 连通性二·边的双连通分量(+原理证明)
		
1184 : 连通性二·边的双连通分量 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在基本的网络搭建完成后,学校为了方便管理还需要对所有的服务器进行编组,网络所的老师 ...
 - poj 2942 Knights of the Round Table  圆桌骑士(双连通分量模板题)
		
Knights of the Round Table Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 9169 Accep ...
 - LA 5135 井下矿工(点—双连通分量模板题)
		
https://vjudge.net/problem/UVALive-5135 题意:在一个无向图上选择尽量少的点涂黑,使得任意删除一个点后,每个连通分量至少有一个黑点. 思路: 首先dfs遍历求出割 ...
 - 图连通性【tarjan点双连通分量、边双联通分量】【无向图】
		
根据 李煜东大牛:图连通性若干拓展问题探讨 ppt学习. 有割点不一定有割边,有割边不一定有割点. 理解low[u]的定义很重要. 1.无向图求割点.点双联通分量: 如果对一条边(x,y),如果low ...
 - [HIHO1184]连通性二·边的双连通分量(双连通分量)
		
题目链接:http://hihocoder.com/problemset/problem/1184 题意裸,写个博客记下输出姿势. /* ━━━━━┒ギリギリ♂ eye! ┓┏┓┏┓┃キリキリ♂ mi ...
 
随机推荐
- EOJ 262 润清的烦恼
			
——题目出处zhoutb2333 题解: 3e6可以带一个log 又是下取整问题.但是分块会TLE. 这样考虑,我们把式子拆成两个部分. 我们先算出来每一个x的[ai/x]项,再算出来[x/ai]项. ...
 - imuxsock lost 353 messages from pid 20261 due to rate-limiting 解决办法
			
日志中出现大量一下日志时 May 24 18:42:08 yw_lvs2_backup rsyslogd-2177: imuxsock lost 353 messages from pid 20261 ...
 - HDU 6249
			
Alice’s Stamps Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
 - Laravel 限流中间件 throttle 简析
			
1. 在Laravel 中配置 在 app\Http\Kernel.php 中,默认添加到中间件组 api 下,1分钟60次. 2. 限流原理 获取唯一请求来源,进行唯一标识(key) 获取该请求请求 ...
 - Ansible lineinfile模块详解
			
目录 简介 修改匹配行 在匹配行前或后添加内容 在匹配行前添加 在匹配行后添加 修改文件内容及权限 删除一行内容 文件存在则添加一行内容 如果有匹配的行则修改该行,如果不匹配则添加 参数backref ...
 - solr6.3.0升级与IK动态词库自动加载
			
摘要:对于中文的搜索来说,词库系统是一个很比较重要的模块,本篇以IK分词器为例子,介绍如何让分词器从缓存或文件系统中自动按照一定频次进行加载扩展词库 Lucene.Solr或ElasticStack如 ...
 - 科学计算三维可视化---Mlab基础(基于Numpy数组的绘图函数)
			
Mlab了解 Mlab是Mayavi提供的面向脚本的api,他可以实现快速的三维可视化,Mayavi可以通过Mlab的绘图函数对Numpy数组建立可视化. 过程为: .建立数据源 .使用Filter( ...
 - SVN启停脚本
			
说明:特别注意红色部分,外部$1传入Msg函数时失效,故特此读取一遍再传入!执行时要给脚本加执行权限!#chmod 755 /scripts/svn [root@kazihuo /scripts]# ...
 - The Difference Between Big Data and a Lot of Data
			
The Difference Between Big Data and a Lot of Data The term “big data” has been around for a while no ...
 - 【转】一个简单的WCF回调实例
			
代码下载:http://files.cnblogs.com/AlwinXu/CallbackService-master.zip 本文转自: http://adamprescott.net/2012/ ...