POJ3694 Network 边双缩点+LCA+并查集
辣鸡错误:把dfs和ldfs搞混。。。QAQ
题意:给定一个无向图,然后查询q次,求每次查询就在图上增加一条边,求剩余割边的个数。
先把边双缩点,然后预处理出LCA的倍增数组;
然后加边时,从u往上跳,把所有u到LCA(u,v)路径上割边去掉,即 --ans;v同理;
而向上跳的时候可以用并查集,把已经去掉的边,用路径压缩忽略掉,会往上跳的更快些。
memset记得写全,不然。。
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#define R register int
const int N=;
using namespace std;
inline int g() {
R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
}
int n,m,cc,cnt,num,dcc,T;
int vr[N<<],nxt[N<<],fir[N],dfn[N],low[N],c[N],d[N],f[N][],fa[N];
bool bge[N<<];
inline void add(int u,int v) {vr[++cnt]=v,nxt[cnt]=fir[u],fir[u]=cnt;}
void tarjan(int u,int E) {
dfn[u]=low[u]=++num;
for(R i=fir[u];i;i=nxt[i]) { R v=vr[i];
if(!dfn[v]) {
tarjan(v,i);
low[u]=min(low[u],low[v]);
if(low[v]>dfn[u]) bge[i]=bge[i^]=true;
} else if(i!=(E^))low[u]=min(low[u],low[v]);
}
}
void dfs(int u) {
c[u]=dcc;
for(R i=fir[u];i;i=nxt[i]) if(!bge[i]&&!c[vr[i]]) dfs(vr[i]);
}
int ff[N],vv[N<<],nn[N<<],tc=;
inline void addc(int u,int v) {vv[++tc]=v,nn[tc]=ff[u],ff[u]=tc;}
inline void solve() {
for(R i=;i<=cnt;++i) {
R u=vr[i^],v=vr[i];
if(c[u]==c[v]) continue;
addc(c[u],c[v]);
}
}
void ldfs(int u) {
for(R i=ff[u];i;i=nn[i]) { R v=vv[i];
if(d[v]) continue;
f[v][]=u,d[v]=d[u]+; R p=u;
for(R j=;f[p][j];++j) f[v][j+]=f[p][j],p=f[p][j];
ldfs(v);
}
}
inline int lca(int u,int v) {
if(d[u]<d[v]) swap(u,v); R lim=log2(d[u])+;
for(R i=lim;i>=;--i) if(d[f[u][i]]>=d[v]) u=f[u][i];
if(u==v) return u;
for(R i=lim;i>=;--i) if(f[u][i]!=f[v][i]) u=f[u][i],v=f[v][i];
return f[u][];
}
int getf(int x) {return x==fa[x]?x:fa[x]=getf(fa[x]);}
signed main() {
while(n=g(),m=g(),m||n) { cnt=;tc=;num=dcc=cc=;
memset(dfn,,sizeof(dfn));memset(low,,sizeof(low));memset(nxt,,sizeof(nxt));memset(fir,,sizeof(fir));
memset(bge,false,sizeof(bge));memset(nn,,sizeof(nn));memset(ff,,sizeof(ff)); memset(c,,sizeof(c));memset(f,,sizeof(f));
for(R i=,u,v;i<=m;++i) u=g(),v=g(),add(u,v),add(v,u);
for(R i=;i<=n;++i) if(!dfn[i]) tarjan(i,);
for(R i=;i<=n;++i) if(!c[i]) ++dcc,dfs(i);
for(R i=;i<=n;++i) fa[i]=i;
solve(); d[]=;ldfs(); R q=g(),ans=dcc-;
printf("Case %d:\n",++T);
while(q--) {
R u=g(),v=g();
u=c[u],v=c[v]; R L=lca(u,v); //cout<<L<<'\n';
u=getf(u),v=getf(v);
while(d[u]>d[L]) fa[u]=f[u][],--ans,u=getf(u);
while(d[v]>d[L]) fa[v]=f[v][],--ans,v=getf(v);
printf("%d\n",ans);
} putchar('\n');
}
74 }
2019.04.12
POJ3694 Network 边双缩点+LCA+并查集的更多相关文章
- POJ3694 Network —— 边双联通分量 + 缩点 + LCA + 并查集
题目链接:https://vjudge.net/problem/POJ-3694 A network administrator manages a large network. The networ ...
- poj3694 Network[边双缩点+树剖/并查集]
首先同一个点双内部的加边肯定不影响..所以先缩点成树,然后每次加一条边,这条对应的树上路径上所有边就都不是桥了,且每次操作独立作用,不相互影响(不过有可能本来一条边已经不是桥了又被标记了一次),所以每 ...
- POJ 3694Network(Tarjan边双联通分量 + 缩点 + LCA并查集维护)
[题意]: 有N个结点M条边的图,有Q次操作,每次操作在点x, y之间加一条边,加完E(x, y)后还有几个桥(割边),每次操作会累积,影响下一次操作. [思路]: 先用Tarjan求出一开始总的桥的 ...
- POJ 3694 (tarjan缩点+LCA+并查集)
好久没写过这么长的代码了,题解东哥讲了那么多,并查集优化还是很厉害的,赶快做做前几天碰到的相似的题. #include <iostream> #include <algorithm& ...
- Poj 3694 Network (连通图缩点+LCA+并查集)
题目链接: Poj 3694 Network 题目描述: 给出一个无向连通图,加入一系列边指定的后,问还剩下多少个桥? 解题思路: 先求出图的双连通分支,然后缩点重新建图,加入一个指定的边后,求出这条 ...
- Codevs 3287 货车运输 2013年NOIP全国联赛提高组(带权LCA+并查集+最大生成树)
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description A 国有 n 座 ...
- 【CodeForces】827 D. Best Edge Weight 最小生成树+倍增LCA+并查集
[题目]D. Best Edge Weight [题意]给定n个点m条边的带边权无向连通图,对每条边求最大边权,满足其他边权不变的前提下图的任意最小生成树都经过它.n,m<=2*10^5,1&l ...
- POJ3694 Network(Tarjan双联通分图 LCA 桥)
链接:http://poj.org/problem?id=3694 题意:给定一个有向连通图,每次增加一条边,求剩下的桥的数量. 思路: 给定一个无向连通图,添加一条u->v的边,求此边对图剩余 ...
- ZOJ 4097 Rescue the Princess 边双缩点+LCA
给你一个图和三个点U,V,W 问你是否存在从U到V和从U到W的两条边不相交路径 先边双缩点 再每个连通分量搞LCA 最后LCA判 #include<bits/stdc++.h> usin ...
随机推荐
- RQNOJ 57 找啊找啊找GF:01背包
题目链接:https://www.rqnoj.cn/problem/57 题意: sqybi在七夕这天太无聊了,所以他想去给自己找GF. 总共有n个MM. 搞定第i个MM要花费rmb[i]块大洋.rp ...
- javascript(7)
js中基于对象==js面向对象 js中没有类class,但是它 JavaScript是一种面向(基于)对象的动态脚本语言,是一种基于对象和事件驱动并具有安全性能的脚本语言.它具有面向对象语言所特有的各 ...
- 如何配置OpenFire上JVM的内存(Memory)
目前OpenFire在Linux下有2种安装方式, 网上对于第二种Linux安装方式下如何配置JVM内存(Memory)并没有描述: tar -xzvf openfire_3_0_0.tar.gzmv ...
- LNMP安装(一)
前传: 环境介绍: Centos7.2-minimal 下载地址:http://mirrors.163.com/centos/7.2.1511/isos/x86_64/ (网易镜像站) 所需安装包:链 ...
- Codeforces 762C Two strings 字符串
Cpdeforces 762C 题目大意: 给定两个字符串a,b\((len \leq 10^5)\),让你去b中的一个连续的字段,使剩余的b串中的拼接起来的两个串是a穿的子序列.最大化这个字串的长度 ...
- QT(2)项目文件介绍
一.项目创建 二.文件说明 三.QT模块
- mac hosts
1 在命令行中输入:sudo vim /etc/hosts. 2 输入开机密码,就可打开文件.按下键盘i,对文件进入可编辑状态. 3 修改完,先按esc退出编辑模式,之后,按shift+:,再按wq来 ...
- bzoj 4278 Tasowanie —— 后缀数组
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4278 每次取两个后缀中字典序较小的那个的首字符: 注意超出去的部分是 inf 而不是 0,因 ...
- WCF知识点(应用WCF支持原生Socket访问, 原始字节流传输)
最近在做区域医疗中PIX时, 需要让PIX Manager同时支持HL7的V2和V3版本.思路是利用WCF来同时支持V2版本的c/s架构式的消息协议和V3版本WebService的Soap协议. 实 ...
- Mysql常用命令行大全(三)
/**操作数据库*/ SHOW DATABASES; CREATE DATABASE db; SHOW DATABASES; DROP DATABASE db; /**操作表*/ USE db; S ...