给我们一个图,然后有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(动态询问割桥的数目)的更多相关文章

  1. hdu4738(割桥)

    找人去炸边,炸完之后分成两个连通块(炸割桥) 每条边上有w个守卫,派去炸桥的人不能比守卫少 所以, 如果原本不连通,那么输出0 如果没有桥,输出-1 如果有桥没有守卫,那么是输出1,而不是0(tric ...

  2. poj3694(lca + tarjan求桥模板)

    题目链接: http://poj.org/problem?id=3694 题意: 给出一个 n 个节点 m 条边的图, 然后有 q 组形如 x, y 的询问, 在前面的基础上连接边 x, y, 输出当 ...

  3. D - Network - poj3694(LCA求桥)

    题意:有一个网络有一些边相互连接,现在有Q次操作,求每次操作后的桥的个数 分析:开始竟然不知道还有LCA这么个东西....... *********************************** ...

  4. 多校联赛2 Problem2 Warm up 求桥的数目+缩点后的树的直径 当时被不知道原因的爆栈爆到无语了。。

    Warm up Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total S ...

  5. tarjan求强连通分量+缩点+割点/割桥(点双/边双)以及一些证明

    “tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄>   自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...

  6. POJ 3694 无向图的桥

    Network Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 10404   Accepted: 3873 Descript ...

  7. [TJOI2012]桥

    Description 有n个岛屿,m座桥,每座桥连通两座岛屿,桥上会有一些敌人,玩家只有消灭了桥上的敌人才能通过,与此同时桥上的敌人会对玩家造成一定伤害.而且会有一个大Boss镇守一座桥,以玩家目前 ...

  8. 【最小割】HDU 4971 A simple brute force problem.

    说是最大权闭合图.... 比赛时没敢写.... 题意 一共同拥有n个任务,m个技术 完毕一个任务可盈利一些钱,学习一个技术要花费钱 完毕某个任务前须要先学习某几个技术 可是可能在学习一个任务前须要学习 ...

  9. js动态创建元素之一--document.write

    以我曾经写过的例子举例 如上图,乡镇街道的名字和数目是根据数据库的数据获取的,有几个乡镇,就会显示出来几个,这就要求动态获取乡镇名称和数目,以下代码中用到了document.write创建动态页面,在 ...

随机推荐

  1. Struts2通过自己定义拦截器实现登录之后跳转到原页面

    这个功能对用户体验来说是非常重要的.实现起来事实上非常easy. 拦截器的代码例如以下: package go.derek.advice; import go.derek.entity.User; i ...

  2. Linux编程实现守护进程

    Linux 守护程序 守护进程(Daemon)它是在一个特定的过程的背景进行.它独立于控制终端的和周期性地执行某些任务或待某些事件.是一种非常实用的进程. Linux的大多数server就是用守护进程 ...

  3. 深度RAMOS,把操作系统全部安装在内存上

     你看下深度RAMOS就知道了  RAMOS+音速启动+绿色软件+云端  很爽 http://www.shenduwin7.com/jiaocheng/52.html

  4. Lucene.Net 2.3.1开发介绍 —— 二、分词(六)

    原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(六) Lucene.Net的上一个版本是2.1,而在2.3.1版本中才引入了Next(Token)方法重载,而ReusableStrin ...

  5. mysql update改动多条数据

    通常情况下,我们会使用下面SQL语句来更新字段值: 复制代码代码例如以下: UPDATE mytable SET myfield='value' WHERE other_field='other_va ...

  6. 第二章排错的工具:调试器Windbg(上)

    感谢博主 http://book.51cto.com/art/200711/59731.htm <Windows用户态程序高效排错>第二章主要介绍用户态调试相关的知识和工具.本文主要讲了排 ...

  7. [SVN]创建本地的SVN仓库

    本地创建SVN仓库,就算是自己平时写代码也养成使用SVN的习惯. 环境: OS:Mac OS X10.9.1 SVN Version:1.7.10 创建本地SVN仓库: $svnadmin creat ...

  8. Android中canvas.save()和canvas.restore()的使用

    自己定义控件时经常遇到重写View的Ondraw()方法,Ondraw()方法经常设计到save()和restore()这两个方法.这两个相互匹配出现的,作用是用来保存画布的状态和取出保存的状态的. ...

  9. Android中使用JNI获得APK签名的哈希值

    原地址:http://blog.csdn.net/i5suoi/article/details/19036975 最近在研究android应用中的安全问题,貌似只有将核心代码写到JNI底层才是最安全的 ...

  10. SQL Server Database 维护计划创建一个完整的备份策略

     SQL Server维护计划Maintenance Plan这是一个非常有用的维护工具,能够完成大部分的数据库维护任务,通过这些功能包.您可以省略大量的编码时间. 介绍的不是非常多,特此补上一篇 ...