POJ3694 Network(边双连通分量+缩点+LCA)
题目大概是给一张图,动态加边动态求割边数。
本想着求出边双连通分量后缩点,然后构成的树用树链剖分+线段树去维护路径上的边数和。。好像好难写。。
看了别人的解法,这题有更简单的算法:
在任意两点添边,那么两点路径上的边就不是割边了,于是从两点往上走到其LCA,一边缩点一边统计消失的割边数。
这样的时间复杂度是保证的,因为最多就把所有点缩完而最多走的边数差不多就原图的边数。
具体实现,用Tarjan求出边双连通分量后缩点;缩点用并查集,要注意合并次序深度小的作深度大的点的根;最后就是对每个询问的两个点向上走到其LCA一边走一边更新。
另外,不必去维护缩点后的树,直接维护Tarjan算法构造的深度优先生成树就行了。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 111111
#define MAXM 444444
struct Edge{
int v,next;
bool flag;
}edge[MAXM];
int NE,head[MAXN];
void addEdge(int u,int v){
edge[NE].v=v; edge[NE].next=head[u]; edge[NE].flag=;
head[u]=NE++;
} int par[MAXN];
int Find(int a){
while(a!=par[a]){
par[a]=par[par[a]];
a=par[a];
}
return a;
}
void Union(int a,int b){
int pa=Find(a),pb=Find(b);
if(pa==pb) return;
par[pb]=pa;
} int fa[MAXN],dep[MAXN],cut;
int dn,dfn[MAXN],low[MAXN];
void dfs(int u){
dfn[u]=low[u]=++dn;
for(int i=head[u]; i!=-; i=edge[i].next){
if(edge[i].flag) continue;
int v=edge[i].v;
if(dfn[v]){
low[u]=min(low[u],dfn[v]);
continue;
}
fa[v]=u; dep[v]=dep[u]+;
edge[i].flag=edge[i^].flag=;
dfs(v);
low[u]=min(low[u],low[v]);
if(low[v]>dfn[u]) ++cut;
else Union(u,v);
}
} int lca(int u,int v){
int cnt=;
u=Find(u); v=Find(v);
while(u!=v){
if(dep[u]>dep[v]){
Union(fa[u],u); ++cnt;
u=Find(fa[u]);
}else if(dep[v]>dep[u]){
Union(fa[v],v); ++cnt;
v=Find(fa[v]);
}else{
Union(fa[u],u); Union(fa[v],v); cnt+=;
u=Find(fa[u]); v=Find(fa[v]);
}
}
return cnt;
}
int main(){
int n,m,a,b,t=;
while(~scanf("%d%d",&n,&m) && (n||m)){
NE=;
memset(head,-,sizeof(head));
while(m--){
scanf("%d%d",&a,&b);
addEdge(a,b); addEdge(b,a);
} for(int i=; i<=n; ++i) par[i]=i;
cut=dn=;
memset(dfn,,sizeof(dfn));
dfs(); printf("Case %d:\n",++t);
scanf("%d",&m);
while(m--){
scanf("%d%d",&a,&b);
cut-=lca(a,b);
printf("%d\n",cut);
}
putchar('\n');
}
return ;
}
POJ3694 Network(边双连通分量+缩点+LCA)的更多相关文章
- HDU 3686 Traffic Real Time Query System(双连通分量缩点+LCA)(2010 Asia Hangzhou Regional Contest)
		
Problem Description City C is really a nightmare of all drivers for its traffic jams. To solve the t ...
 - 图论-桥/割点/双连通分量/缩点/LCA
		
基本概念: 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个 ...
 - HDU 2460 Network 边双连通分量 缩点
		
题意: 给出一个无向连通图,有\(m\)次操作,每次在\(u, v\)之间加一条边,并输出此时图中桥的个数. 分析: 先找出边双连通分量然后缩点得到一棵树,树上的每条边都输原图中的桥,因此此时桥的个数 ...
 - POJ3177 Redundant Paths(边双连通分量+缩点)
		
题目大概是给一个无向连通图,问最少加几条边,使图的任意两点都至少有两条边不重复路径. 如果一个图是边双连通图,即不存在割边,那么任何两个点都满足至少有两条边不重复路径,因为假设有重复边那这条边一定就是 ...
 - 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP)
		
layout: post title: 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP) author: "luowentaoaa" catalog: true ...
 - 连通分量模板:tarjan: 求割点 && 桥 && 缩点 && 强连通分量 && 双连通分量 && LCA(近期公共祖先)
		
PS:摘自一不知名的来自大神. 1.割点:若删掉某点后.原连通图分裂为多个子图.则称该点为割点. 2.割点集合:在一个无向连通图中,假设有一个顶点集合,删除这个顶点集合,以及这个集合中全部顶点相关联的 ...
 - poj3177(边双连通分量+缩点)
		
传送门:Redundant Paths 题意:有n个牧场,Bessie 要从一个牧场到另一个牧场,要求至少要有2条独立的路可以走.现已有m条路,求至少要新建多少条路,使得任何两个牧场之间至少有两条独立 ...
 - POJ3352 Road Construction 双连通分量+缩点
		
Road Construction Description It's almost summer time, and that means that it's almost summer constr ...
 - poj 3694双联通缩点+LCA
		
题意:给你一个无向连通图,每次加一条边后,问图中桥的数目. 思路:先将图进行双联通缩点,则缩点后图的边就是桥,然后dfs记录节点深度,给出(u,v)使其节点深度先降到同一等级,然后同时降等级直到汇合到 ...
 
随机推荐
- HDU 3998 Sequence(经典问题,最长上升子序列)
			
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3998 解题报告:求一个数列的最长上升子序列,并求像这样长的不相交的子序列最多有多少个. 我用的是最简单 ...
 - 在C/C++程序里打印调用栈信息
			
我们知道,GDB的backtrace命令可以查看堆栈信息.但很多时候,GDB根本用不上.比如说,在线上环境中可能没有GDB,即使有,也不太可能让我们直接在上面调试.如果能让程序自己输出调用栈,那是最好 ...
 - python中import和from...import...的区别
			
python中import和from...import...的区别: 只用import时,如import xx,引入的xx是模块名,而不是模块内具体的类.函数.变量等成员,使用该模块的成员时需写成xx ...
 - fsck检查和修复文件系统
			
重视:fsck不能乱用.先要把文件系统umount掉,然后检查.最好启动到单用户模式下fsck. 常见的5种损坏类型 1 未被引用的inode 2 难以置信的超大链接数 3 没有记录在磁盘块映射表中的 ...
 - python安装问题
			
安装MinGW之后 出现.. 解决方案 ================
 - cURL的几个经典实例
			
1.cURL请求的基本步骤: (1)初始化 (2)设置选项,包括URL (3)执行并获取HTML文档内容 (4)释放cURL句柄 <?php //1.初始化 $ch = curl_init(); ...
 - Mobile first! Wijmo 5 + Ionic Framework之:Hello World!
			
本教程中,我们用Wijmo 5 和 Ionic Framework实现一个Mobile的工程:Hello World. Ionic是什么? Ionic是一个HTML5框架.免费.开源,用于帮助生成hy ...
 - java call sap
			
1.下载需要的jar,windows用dll,linux用so win下载地址 linux下载地址 win下载地址new 2.环境: windows -> sapjco3.dll放到wi ...
 - XX管理系统案例
			
一.登录界面建立登录文件夹Login,在此目录下面建立如下文件:Index.htm:登录页面ValidateCode.cs:生成验证码ProcessVerification.ashx:处理验证码Com ...
 - C++实现大数据乘法
			
结构体定义与封装 struct bigdatacom { private : ]; ]; public : void init(const char *str1,const char *str2) { ...