/*
给定一个无向图,往里面加边,问加第i条边时图中的桥数
首先肯定要求初始状态下的桥,染色缩点
每次给定的边为(u,v), 那么u->lca(u,v)->v路上的所有边都不再是桥
求LCA时可以直接暴力,一个一个点往上找即可,网上好多题解都是用并查集做的。。
*/
#include<bits/stdc++.h>
using namespace std;
#define maxn 200005
struct Edge{int to,nxt,cut;}edge[maxn<<],edge_c[maxn<<];
int head[maxn],tot,head_c[maxn],tot_c,n,m,q; void addedge(int u,int v){
edge[tot].to=v;edge[tot].nxt=head[u];head[u]=tot++;
edge[tot].cut=;
}
void add_c(int u,int v){
edge_c[tot_c].to=v;
edge_c[tot_c].nxt=head_c[u];
head_c[u]=tot_c++;
} int dfn[maxn],low[maxn],ind,c[maxn],dcc;
void tarjan(int u,int in_edge){
dfn[u]=low[u]=++ind;
for(int i=head[u];i!=-;i=edge[i].nxt){
int v=edge[i].to;
if(!dfn[v]){
tarjan(v,i);
low[u]=min(low[u],low[v]); if(dfn[u]<low[v])
edge[i].cut=edge[i^].cut=;
}
else if(i!=(in_edge^))
low[u]=min(low[u],dfn[v]);
}
}
void dfs1(int u){
c[u]=dcc;
for(int i=head[u];i!=-;i=edge[i].nxt){
int v=edge[i].to;
if(c[v]||edge[i].cut)continue;
dfs1(v);
}
} int dep[maxn],fa[maxn],flag[maxn];//flag[u]表示u上点的边使割边
void dfs2(int u,int pre,int deep){
dep[u]=deep;fa[u]=pre;flag[u]=;
for(int i=head_c[u];i!=-;i=edge_c[i].nxt){
int v=edge_c[i].to;
if(v==pre)continue;
dfs2(v,u,deep+);
}
}
int lca(int u,int v){
int res=;
if(dep[u]<dep[v])swap(u,v);
while(dep[u]>dep[v]){
if(flag[u])
res++,flag[u]=;
u=fa[u];
}
while(u!=v){
if(flag[u])
res++,flag[u]=;
if(flag[v])
res++,flag[v]=;
u=fa[u];
v=fa[v];
}
return res;
}
void init(){
memset(head,-,sizeof head);
memset(head_c,-,sizeof head_c);
memset(dep,,sizeof dep);
memset(fa,,sizeof fa);
memset(flag,,sizeof flag);
memset(c,,sizeof c);
memset(dfn,,sizeof dfn);
memset(low,,sizeof low);
tot=tot_c=ind=dcc=;
}
int main(){
int tt=;
while(cin>>n>>m,n){
init();
for(int i=;i<=m;i++){
int u,v;
cin>>u>>v;
addedge(u,v);
addedge(v,u);
}
tarjan(,); dcc=;//染色
for(int i=;i<=n;i++)
if(!c[i]){
++dcc;
dfs1(i);
} int ans=;
for(int i=;i<tot;i++){//缩点
int v=edge[i].to,u=edge[i^].to;
if(c[u]==c[v])continue;
add_c(c[u],c[v]);
if(edge[i].cut)ans++;
}
ans/=; printf("Case %d:\n",++tt); dfs2(,,);//求出dep数组
cin>>q;
for(int i=;i<=q;i++){
int u,v;
cin>>u>>v;
ans-=lca(c[u],c[v]);
printf("%d\n",ans);
} /* for(int i=1;i<=n;i++)
cout<<i<<" "<<c[i]<<" "<<dep[c[i]]<<" "<<fa[c[i]]<<endl;
*/
puts("");
}
return ;
}

hdu2460 e-DCC染色缩点+暴力LCA的更多相关文章

  1. H - Rescue the Princess ZOJ - 4097 (tarjan缩点+倍增lca)

    题目链接: H - Rescue the Princess  ZOJ - 4097 学习链接: zoj4097 Rescue the Princess无向图缩点有重边+lca - lhc..._博客园 ...

  2. hihoCoder 1185 连通性·三(Tarjan缩点+暴力DFS)

    #1185 : 连通性·三 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 暑假到了!!小Hi和小Ho为了体验生活,来到了住在大草原的约翰家.今天一大早,约翰因为有事要出 ...

  3. hdu 4674 Trip Advisor(缩点+倍增lca)

    花了一天半的时间,才把这道题ac= = 确实是道好题,好久没敲这么长的code了,尤其是最后的判定,各种销魂啊~ 题目中给出的条件最值得关注的就是:每个点最多只能在一个环内->原图是由一个个边连 ...

  4. HDU 3072 Intelligence System(tarjan染色缩点+贪心+最小树形图)

    Intelligence System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  5. POJ 3694 Network (求桥,边双连通分支缩点,lca)

    Network Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5619   Accepted: 1939 Descripti ...

  6. poj2186-Popular Cows【Tarjan】+(染色+缩点)(经典)

    <题目链接> 题目大意: 有N(N<=10000)头牛,每头牛都想成为most poluler的牛,给出M(M<=50000)个关系,如(1,2)代表1欢迎2,关系可以传递,但 ...

  7. BZOJ 4668: 冷战 并查集&&暴力LCA(雾)

    利用并查集按秩合并,保存每个点合并的时间: 求时间时,就一直跳u=fa[u],并记录路径上时间的最大值,代表最后一次合并的时间 #include<cstdio> #include<i ...

  8. hdu4612 卡cin e-DCC缩点

    /* 给定无向图,求加入一条边后最少剩下多少桥 */ #include<bits/stdc++.h> using namespace std; #define maxn 200005 #d ...

  9. LCA(Lowest Common Ancesor)

    LCA(Lowest Common Ancesor) 1.基于二分搜索算法 预处理father[v][k]表示v的2的k次方层祖先,时间复杂度是O(nlogn),每次查询的时间复杂度是O(logn), ...

随机推荐

  1. linux find 只获取文件名而去除路径

    find /var/process_log/ -name '*.log' -exec basename {} \;

  2. Service Mesh

    概念 A service mesh is a dedicated infrastructure layer for handling service-to-service communication. ...

  3. VGGNet学习——实践

    0 - DataSet http://www.csc.kth.se/~att/Site/Animals.html 1 - Code 1.1 - Import Packages import tenso ...

  4. 关于istream_iterator<int>(cin)和istream_iterator<int>()的一点分析

    最近在看STL,其中讲到容器这一部分的时候,有以下两个式子,有点疑惑: deque<) //函数声明 deque<) //定义一个容器 式子原本的含义都是要定义一个容器,容器的内容从标准输 ...

  5. vue 选城市三级联动

    <div id="example"> <select v-model="prov"> <option v-for="op ...

  6. 设计模式C++学习笔记之四(Multition多例模式)

      多例模式,这个在GOF的模式设计里没有提到,但在实际工作中确实会用到.更详细的内容及说明可以参考原作者博客:cbf4life.cnblogs.com. 4.1.解释 main(),客户 略 说明: ...

  7. Delta DVP 系列 PLC 各装置 Modbus 地址

    此Modbus地址表以 1 为基础地址 Device Range Type DVP address (Hex) Modbus address (Dec) Effective ES/EX/SS SA/S ...

  8. day2 --> pyc 文件

    执行python 代码时,如果导入了其他的.py文件,那么,执行过程中会自动生成一个与其同名的.pyc文件,该文件就是python解释器便宜之后产生的字节码. PS:代码经过便宜可以产生字节码;字节码 ...

  9. 51nod--1256 乘法逆元 (扩展欧几里得)

    题目: 1256 乘法逆元 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < ...

  10. 基于centos7下appium环境搭建

    事件背景: 前几日在群里看到关总说他的server端是搭建在linux环境下,包括对客户端与服务端的交互处理,感觉整体思路清晰可鉴,于是就想尝试,动手实践,接着从环境搭建开始搞起,于是就有了这篇文章, ...