poj3694(动态询问割桥的数目)
给我们一个图,然后有q次加边的操作,问每次加完边之后有多少个桥存在
首先用dfs求出所有的桥,然后dfs的过程中生成了一棵dfs树,该树有的边是桥,有的不是,用bridge[v] = true , 表示v与fa[v]的连边是桥
当加入一个边u,v后, u,v,lca(u,v)上的边从割边变成了非割边。
至于lca,我们可以用dfs过程中的dfn标号来向上回溯。
因为dfn[u] > dfn[lca(u,v)], dfn[v] > dfn[lca(u,v])
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <vector>
#include <stack>
#include <map>
#include <set>
#include <string>
#include <functional>
using namespace std; const int N = +;
int head[N],next[N*],to[N*],e;
int dfn[N],low[N],dfs_clock,cut,bridge[N],pre[N]; void init(int n)
{
e = dfs_clock = cut = ;
memset(head,-,sizeof(head));
for(int i=;i<=n;++i)
{
fa[i] = i;
dfn[i] = low[i] = bridge[i] = ;
}
}
void addEdge(int u, int v)
{
to[e] = v;
next[e] = head[u];
head[u] = e++;
} void tarjan(int u, int f)
{
dfn[u] = low[u] = ++dfs_clock;
bool flag = false;
for(int i=head[u]; i!=-; i=next[i])
{
int v = to[i];
if(v==f && !flag)
{
flag=true;
continue;
}
if(dfn[v]==)
{
pre[v] = u;
tarjan(v,u);
}
low[u] = min(low[v],low[u]);
if(low[v] > dfn[u])
{
bridge[v] = true;
cut++;
}
}
} void lca(int u, int v)
{
if(dfn[u] < dfn[v])
swap(u,v);
while(dfn[u] > dfn[v])//回溯完后u就是lca
{ if(bridge[u])
{
cut--;
bridge[u] = false;
}
u = pre[u];
}
while(dfn[u] < dfn[v])
{ if(bridge[v])
{
cut--;
bridge[v] = false;
}
v = pre[v];
}
}
int main()
{
int n,m;
int u,v;
int tcase = ;
while(scanf("%d%d",&n,&m),n+m)
{
init(n);
for(int i=;i<=m;++i)
{
scanf("%d%d",&u,&v);
addEdge(u,v);addEdge(v,u);
}
printf("Case %d:\n",tcase++);
tarjan(,-);
int q;
scanf("%d",&q);
while(q--)
{
scanf("%d%d",&u,&v);
lca(u,v);
printf("%d\n",cut);
}
puts("");
}
return ;
}
poj3694(动态询问割桥的数目)的更多相关文章
- hdu4738(割桥)
找人去炸边,炸完之后分成两个连通块(炸割桥) 每条边上有w个守卫,派去炸桥的人不能比守卫少 所以, 如果原本不连通,那么输出0 如果没有桥,输出-1 如果有桥没有守卫,那么是输出1,而不是0(tric ...
- poj3694(lca + tarjan求桥模板)
题目链接: http://poj.org/problem?id=3694 题意: 给出一个 n 个节点 m 条边的图, 然后有 q 组形如 x, y 的询问, 在前面的基础上连接边 x, y, 输出当 ...
- D - Network - poj3694(LCA求桥)
题意:有一个网络有一些边相互连接,现在有Q次操作,求每次操作后的桥的个数 分析:开始竟然不知道还有LCA这么个东西....... *********************************** ...
- 多校联赛2 Problem2 Warm up 求桥的数目+缩点后的树的直径 当时被不知道原因的爆栈爆到无语了。。
Warm up Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Total S ...
- tarjan求强连通分量+缩点+割点/割桥(点双/边双)以及一些证明
“tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄> 自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...
- POJ 3694 无向图的桥
Network Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10404 Accepted: 3873 Descript ...
- [TJOI2012]桥
Description 有n个岛屿,m座桥,每座桥连通两座岛屿,桥上会有一些敌人,玩家只有消灭了桥上的敌人才能通过,与此同时桥上的敌人会对玩家造成一定伤害.而且会有一个大Boss镇守一座桥,以玩家目前 ...
- 【最小割】HDU 4971 A simple brute force problem.
说是最大权闭合图.... 比赛时没敢写.... 题意 一共同拥有n个任务,m个技术 完毕一个任务可盈利一些钱,学习一个技术要花费钱 完毕某个任务前须要先学习某几个技术 可是可能在学习一个任务前须要学习 ...
- js动态创建元素之一--document.write
以我曾经写过的例子举例 如上图,乡镇街道的名字和数目是根据数据库的数据获取的,有几个乡镇,就会显示出来几个,这就要求动态获取乡镇名称和数目,以下代码中用到了document.write创建动态页面,在 ...
随机推荐
- Oracle安装配置流程
Oracle安装流程 第一次自己动手安装oracle,之前对oracle安装配置一窍不通,最后最终弄好.总结下. 1. 安装oracle10gserver端 2. 安装oracle10gclien ...
- Ceph与GlusterFS等等(80篇博客)
http://blog.csdn.net/liuben/article/category/373751
- Emotion英语学习
英语学习断断续续也快两年了,以前也蜻蜓点水地写过几篇总结,但是因为思考的少,只能得到一些表面的收获.从今年三月初到现在,口语阶段已经有三个月,感触较多,所以写这篇博客对这段时间英语学习的一个整体总结. ...
- 给c++程序员的一份礼物——常用工具集
给c++程序员的一份礼物——常用工具集 [声明]如需复制.传播,请附上本声明,谢谢.原文出处:http://morningspace.51.net/,moyingzz@etang.com 所谓&quo ...
- gcc -D 传值给代码,默认值为1
gcc -D 传值给代码,默认值为1 -D 参数可以给代码中的宏打开一扇门.简单的代码#include <stdio.h> #ifdef WHO #define NAME "jo ...
- Cocos2d-x 创建(create)动画对象CCAnimation报错分析
本人在使用精灵表单创建动画的过程中突然遇到了一些个问题,下面进行一下分析总结. 根据在Cocos2d-iphone中的经验,我写出了如下的代码: CCSpriteFrameCache::sharedS ...
- Java中double变量精确到小数点后几(2)位
import java.math.BigDecimal; import java.text.NumberFormat; public class Java中double类型的数据精确到小数点后两位 { ...
- MVC Json 回报
/// <summary> /// 获取评论列表 /// </summary> /// <param name="pageIndex">< ...
- FreeSwitch安装和配置记录
安装FreeSwitch 主要示例,下面的命令: git clone -b v1.2.stable git://git.freeswitch.org/freeswitch.git cd freeswi ...
- Linux ssh密钥自动登录(转)
在开发中,经常需要从一台主机ssh登陆到另一台主机去,每次都需要输一次login/Password,很繁琐.使用密钥登陆就可以不用输入用户名和密码了 实现从主机A免密码登陆到主机B,需要以下几个步骤: ...