POJ 3694 tarjan 桥+lca
| Time Limit: 5000MS | Memory Limit: 65536K | |
| Total Submissions: 7298 | Accepted: 2651 |
Description
A network administrator manages a large network. The network consists of N computers and M links between pairs of computers. Any pair of computers are connected directly or indirectly by successive links, so data can be transformed between any two computers. The administrator finds that some links are vital to the network, because failure of any one of them can cause that data can't be transformed between some computers. He call such a link a bridge. He is planning to add some new links one by one to eliminate all bridges.
You are to help the administrator by reporting the number of bridges in the network after each new link is added.
Input
The input consists of multiple test cases. Each test case starts with a line containing two integers N(1 ≤ N ≤ 100,000) and M(N - 1 ≤ M ≤ 200,000).
Each of the following M lines contains two integers A and B ( 1≤ A ≠ B ≤ N), which indicates a link between computer A and B. Computers are numbered from 1 to N. It is guaranteed that any two computers are connected in the initial network.
The next line contains a single integer Q ( 1 ≤ Q ≤ 1,000), which is the number of new links the administrator plans to add to the network one by one.
The i-th line of the following Q lines contains two integer A and B (1 ≤ A ≠ B ≤ N), which is the i-th added new link connecting computer A and B.
The last test case is followed by a line containing two zeros.
Output
For each test case, print a line containing the test case number( beginning with 1) and Q lines, the i-th of which contains a integer indicating the number of bridges in the network after the first i new links are added. Print a blank line after the output for each test case.
Sample Input
3 2
1 2
2 3
2
1 2
1 3
4 4
1 2
2 1
2 3
1 4
2
1 2
3 4
0 0
Sample Output
Case 1:
1
0 Case 2:
2
0
Source
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
#include <cmath>
#include <set>
#include <map>
#include <stack>
using namespace std; #define N 100005 int n, m;
int dfn[N], low[N], Time;
int dep[N];
bool brg[N];
int father[N];
int brg_num; struct Edge{
int u, v, next;
}e[]; int cnt;
int head[N]; void setEdge(int u,int v){
e[cnt].u=u;e[cnt].v=v;
e[cnt].next=head[u];head[u]=cnt++;
} void tarjan(int u,int fa){
int i, v;
dfn[u]=low[u]=Time++;
for(i=head[u];i!=-;i=e[i].next){
v=e[i].v;
if(v==fa) continue;
if(!dfn[v]){
dep[v]=dep[u]+;
father[v]=u;
tarjan(v,u);
if(low[v]>dfn[u]){
brg_num++;
brg[v]=true;
}
low[u]=min(low[u],low[v]);
}
else low[u]=min(dfn[v],low[u]);
}
} void lca(int u,int v){
while(dep[u]>dep[v]){
if(brg[u]) {
brg[u]=false,brg_num--;
}
u=father[u];
}
while(dep[v]>dep[u]){
if(brg[v]) {
brg[v]=false,brg_num--;
}
v=father[v];
}
while(u!=v){
if(brg[u]) {
brg[u]=false,brg_num--;
}
u=father[u];
if(brg[v]) {
brg[v]=false,brg_num--;
}
v=father[v];
}
} main()
{
int i, j, k;
int u, v;
int kase=;
while(scanf("%d %d",&n,&m)==){
if(!n&&!m) break;
memset(head,-,sizeof(head));
cnt=;
for(i=;i<m;i++){
scanf("%d %d",&u,&v);
setEdge(u,v);
setEdge(v,u);
}
Time=;
memset(dfn,,sizeof(dfn));
memset(brg,false,sizeof(brg));
brg_num=;
for(i=;i<=n;i++){
if(!dfn[i]){
dep[i]=;
tarjan(i,i);
}
}
printf("Case %d:\n",kase++);
int q;
scanf("%d",&q);
for(i=;i<q;i++){
scanf("%d %d",&u,&v);
lca(u,v);
printf("%d\n",brg_num);
}
cout<<endl;
}
}
POJ 3694 tarjan 桥+lca的更多相关文章
- POJ 3694 (tarjan缩点+LCA+并查集)
好久没写过这么长的代码了,题解东哥讲了那么多,并查集优化还是很厉害的,赶快做做前几天碰到的相似的题. #include <iostream> #include <algorithm& ...
- poj 3694 Network(割边+lca)
题目链接:http://poj.org/problem?id=3694 题意:一个无向图中本来有若干条桥,有Q个操作,每次加一条边(u,v),每次操作后输出桥的数目. 分析:通常的做法是:先求出该无向 ...
- hdu 2460 poj 3694 (双联通+LCA)
在给出的两个点上加一条边,求剩下桥的数量,,不会LCA在线,就用了最普通的,先Tarjan双联通缩点,然后将缩完的图建成一棵树,树的所有边就是桥了,如果在任意两点间加一条边的话,那么从两点到最近公共祖 ...
- poj 3694(割边+lca)
题意:给你一个无向图,可能有重边,有q次询问,问你每次我添加一条边,添加后这个图还有多少个桥 解题思路:首先先把所有没有割边的点对缩成一个联通块,无向图一般并查集判环,然后就得到一个割边树,给你一条新 ...
- 【POJ 3694】 Network(割边<桥>+LCA)
[POJ 3694] Network(割边+LCA) Network Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7971 ...
- POJ 3694——Network——————【连通图,LCA求桥】
Network Time Limit:5000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Stat ...
- Poj 3694 Network (连通图缩点+LCA+并查集)
题目链接: Poj 3694 Network 题目描述: 给出一个无向连通图,加入一系列边指定的后,问还剩下多少个桥? 解题思路: 先求出图的双连通分支,然后缩点重新建图,加入一个指定的边后,求出这条 ...
- Tarjan算法各种&RMQ& POJ 3694
关于tarjan 的思想可以在网上搜到,具体我也不太清楚,应该说自己理解也不深,下面是做题经验得到的一些模板. 其中有很多转载,包括BYVoid等,感谢让我转...望各路大神愿谅 有向图求连通分量的一 ...
- 【Tarjan】洛谷P3379 Tarjan求LCA
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...
随机推荐
- 7.$a = 'abcdef'; 请取出$a的值并打印出第一个字母
echo $a[0]; echo $a{0}; echo chr(ord($a));//先输出$a字符串里的第一个字符的ASCII值 再从指定的 ASCII 值返回字符.
- AJAX-----10iframe模拟ajax文件上传效果原理2
在实际开发中其实我们可以给用户一些提示,比如上传成功或者上传失败,废话不多说,走码: <!DOCTYPE html> <html lang="en"> &l ...
- Excel应该这么玩——3、命名表格:彻底改造公式
上一篇介绍了通过命名列将公式中的地址引用去掉,让公式更容易理解.但是之前的命名列只是针对单个表格的,如何引用其他表格的列是本篇的主要内容. 1.创建命名表格 命名表格的前提的创建表格,这个操作上一篇已 ...
- Monkey之环境搭建完全版
图文版将在后期补充. 如果想要搭建好Monkey的测试环境,首先几个必要的步骤和环境不能少,分别是java相关环境.Android SDK环境,启动android虚拟机或连接真机.执行monkey测试 ...
- springmvc web-info目录下无法引入的js文件无效
今天在联系spring的时候而然遇到了个不起眼的问题.那就是在html或者说jsp页面中引用js文件的时候总是提示找不到路径.eclipse更是抛出 No mapping to aa.js. 我就奇怪 ...
- AtCoder Beginner Contest 050 ABC题
A - Addition and Subtraction Easy Time limit : 2sec / Memory limit : 256MB Score : 100 points Proble ...
- Nginx的负载均衡 - 整体架构
Nginx的负载均衡 - 整体架构 Nginx版本:1.9.1 我的博客:http://blog.csdn.net/zhangskd Nginx目前提供的负载均衡模块: ngx_http_upstre ...
- Android 性能分析工具dumpsys的使用(自己增加一部分在后面)
Android提供的dumpsys工具可以用于查看感兴趣的系统服务信息与状态,手机连接电脑后可以直接命令行执行adb shell dumpsys 查看所有支持的Service但是这样输出的太多,可以通 ...
- MVC简单实例
using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressi ...
- Unity3d 脚本相互调用
unity中三种调用其他脚本函数的方法 第一种,被调用脚本函数为static类型,调用时直接用 脚本名.函数名().很不实用…… 第二种,GameObject.Find("脚本所在物体名& ...