hdu2460 e-DCC染色缩点+暴力LCA
/*
给定一个无向图,往里面加边,问加第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的更多相关文章
- H - Rescue the Princess ZOJ - 4097 (tarjan缩点+倍增lca)
题目链接: H - Rescue the Princess ZOJ - 4097 学习链接: zoj4097 Rescue the Princess无向图缩点有重边+lca - lhc..._博客园 ...
- hihoCoder 1185 连通性·三(Tarjan缩点+暴力DFS)
#1185 : 连通性·三 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 暑假到了!!小Hi和小Ho为了体验生活,来到了住在大草原的约翰家.今天一大早,约翰因为有事要出 ...
- hdu 4674 Trip Advisor(缩点+倍增lca)
花了一天半的时间,才把这道题ac= = 确实是道好题,好久没敲这么长的code了,尤其是最后的判定,各种销魂啊~ 题目中给出的条件最值得关注的就是:每个点最多只能在一个环内->原图是由一个个边连 ...
- HDU 3072 Intelligence System(tarjan染色缩点+贪心+最小树形图)
Intelligence System Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- POJ 3694 Network (求桥,边双连通分支缩点,lca)
Network Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5619 Accepted: 1939 Descripti ...
- poj2186-Popular Cows【Tarjan】+(染色+缩点)(经典)
<题目链接> 题目大意: 有N(N<=10000)头牛,每头牛都想成为most poluler的牛,给出M(M<=50000)个关系,如(1,2)代表1欢迎2,关系可以传递,但 ...
- BZOJ 4668: 冷战 并查集&&暴力LCA(雾)
利用并查集按秩合并,保存每个点合并的时间: 求时间时,就一直跳u=fa[u],并记录路径上时间的最大值,代表最后一次合并的时间 #include<cstdio> #include<i ...
- hdu4612 卡cin e-DCC缩点
/* 给定无向图,求加入一条边后最少剩下多少桥 */ #include<bits/stdc++.h> using namespace std; #define maxn 200005 #d ...
- LCA(Lowest Common Ancesor)
LCA(Lowest Common Ancesor) 1.基于二分搜索算法 预处理father[v][k]表示v的2的k次方层祖先,时间复杂度是O(nlogn),每次查询的时间复杂度是O(logn), ...
随机推荐
- Python基础2(2017-07-18)
1.列表.元素操作 定义列表 list = ['Doris','Linda','Dandy','Allen'] 基础的读取操作 list = ['Doris','Linda','Dandy','All ...
- Core Mvc传值Query、Form、Cookies、Session、TempData、Cache
1.传值方法 使用Request的方法(1-3): 1)Query:获取链接?后面的值 如:http://localhost:55842/Home/About?name=kxy public IAct ...
- 课程10:《黑马程序员_Hibernate开发资料》视频目录--没有细看
老师很厉害,讲得蛮详细的 \Hibernate视频教程\01_黑马程序员_Hibernate教程__Hibernate入门基础.avi; \Hibernate视频教程\02_黑马程序员_Hiberna ...
- EasyGui的一个小例子
EasyGui的安装:首先下载easyGui安装包,地址链接:https://pan.baidu.com/s/1D8f_eXWn7l8xhcTuEsqZmA 密码:e5z5 安装步骤: 1.进入eas ...
- 安装mysql8.0.12以及修改密码和Navicat的连接
mysql8.0+与安装其他版本不同一.安装mysql8.0.121.到官网https://www.mysql.com/ 下载mysql-8.0.12-winx64.zip(不要.mis),直接解压 ...
- 自动配置redis主从和哨兵
redis shell 每次创建redis主从和哨兵服务,文件夹要复制好几个,配置文件改一大堆.繁琐还容易出错,就想通过shell脚本自动帮我配置好端口以及文件,下面就是脚本内容: redis-to ...
- 用函数SendARP()获取局域网计算机的MAC地址
sendARP 31 说明对方没有开机,我们的函数检测不到它, 1784 说明的给函数的最后一个参数的值是0,或你的给的值与你给的缓存区大小不符合. 如果返回31不在线,则最后一个参数指针指向的值赋值 ...
- 迁移学习(Transfer Learning)
原文地址:http://blog.csdn.net/miscclp/article/details/6339456 在传统的机器学习的框架下,学习的任务就是在给定充分训练数据的基础上来学习一个分类模型 ...
- zTree:一个依靠 jQuery 实现的多功能 “树插件”
官方网站: http://www.treejs.cn/v3/main.php#_zTreeInfo 使用方式: 步骤1.文件准备 将需要使用的 zTree v3.x 相关的 js.css.img 文件 ...
- DbProviderFactory
背景 在此之前,我一直以为调用哪个数据库就要用它专门的链接,除非是odbc方式.后来用了java,想.net怎么没有通用的链接呢,尤其是oracle,还要装他的客户端,如此不方便竟然能流行起来.后来知 ...