题目链接:http://poj.org/problem?id=3694

题目:

题意:给你一个n个点m条边的无向连通图,进行q次操作,每次操作在u和v之间加一条边,问每次操作之后“桥”的数量。

思路:先tarjan预处理出初始状态“桥”的数量cnt,并进行标记,对于每次操作,进行lca查询,将u和v之间的桥的数量num统计好,并消除标记,结果就是cnt-num。

代码实现如下:

 #include <set>
#include <map>
#include <queue>
#include <stack>
#include <cmath>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; typedef long long ll;
typedef pair<ll, ll> pll;
typedef pair<ll, int> pli;
typedef pair<int, ll> pil;;
typedef pair<int, int> pii;
typedef unsigned long long ull; #define lson i<<1
#define rson i<<1|1
#define bug printf("*********\n");
#define FIN freopen("D://code//in.txt", "r", stdin);
#define debug(x) cout<<"["<<x<<"]" <<endl;
#define IO ios::sync_with_stdio(false),cin.tie(0); const double eps = 1e-;
const int mod = ;
const int maxn = 1e5 + ;
const double pi = acos(-);
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f; int n, m, q, u, v, tot, cnt, num;
int head[maxn], dfn[maxn], low[maxn], vis[maxn], pre[maxn], c[maxn]; struct edge {
int v, next;
}ed[maxn<<]; void init() {
tot = cnt = num = ;
memset(c, , sizeof(c));
memset(vis, , sizeof(vis));
memset(dfn, , sizeof(dfn));
memset(low, , sizeof(low));
memset(head, -, sizeof(head));
for(int i = ; i < maxn; i++) {
pre[i] = i;
}
} void addedge(int u, int v) {
ed[tot].v = v;
ed[tot].next = head[u];
head[u] = tot++;
ed[tot].v = u;
ed[tot].next = head[v];
head[v] = tot++;
} void tarjan(int x, int fa) {
dfn[x] = low[x] = ++num;
c[x] = ;
for(int i = head[x]; ~i; i = ed[i].next) {
int v = ed[i].v;
if(!c[v]) {
tarjan(v, x);
pre[v] = x;
low[x] = min(low[x], low[v]);
if(low[v] > dfn[x]) {
vis[v] = ;
cnt++;
}
} else if(c[v] == && v != fa) {
low[x] = min(low[x], dfn[v]);
}
}
c[x] = ;
} int cut(int x, int y) {
int cnt = ;
while(dfn[x] > dfn[y]) {
if(vis[x]) {
cnt++;
vis[x] = ;
}
x = pre[x];
}
while(dfn[y] > dfn[x]) {
if(vis[y]) {
cnt++;
vis[y] = ;
}
y = pre[y];
}
while(x != y) {
if(vis[x]) {
cnt++;
vis[x] = ;
}
if(vis[y]) {
cnt++;
vis[y] = ;
}
x = pre[x];
y = pre[y];
}
return cnt;
} int main() {
//FIN;
int icase = ;
while(~scanf("%d%d", &n, &m)) {
if(n == && m == ) break;
init();
for(int i = ; i <= m; i++) {
scanf("%d%d", &u, &v);
addedge(u, v);
}
printf("Case %d:\n", ++icase);
tarjan(, );
scanf("%d", &q);
while(q--) {
scanf("%d%d", &u, &v);
cnt -= cut(u, v);
printf("%d\n", cnt);
}
printf("\n");
}
return ;
}

Network(POJ3694+边双连通分量+LCA)的更多相关文章

  1. poj3694 边-双连通分量+lca

    题意:先给了一张无向图,然后依次加边,每次求桥的数量 题解:先用一次tarjan,我们可以标记桥的位置和记录桥的数量同时记录fa数组,然后更新边的时候我们可以用lca,因为在tarjan缩点之后得到了 ...

  2. Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载)

    Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载) 转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2 ...

  3. POJ3694 Network(边双连通分量+缩点+LCA)

    题目大概是给一张图,动态加边动态求割边数. 本想着求出边双连通分量后缩点,然后构成的树用树链剖分+线段树去维护路径上的边数和..好像好难写.. 看了别人的解法,这题有更简单的算法: 在任意两点添边,那 ...

  4. HDU 5458 Stability(双连通分量+LCA+并查集+树状数组)(2015 ACM/ICPC Asia Regional Shenyang Online)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5458 Problem Description Given an undirected connecte ...

  5. Tarjan应用:求割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)【转】【修改】

    一.基本概念: 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成 ...

  6. (转)Tarjan应用:求割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)

    基本概念: 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个 ...

  7. hdu 2460(tarjan求边双连通分量+LCA)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2460 思路:题目的意思是要求在原图中加边后桥的数量,首先我们可以通过Tarjan求边双连通分量,对于边 ...

  8. POJ1144 Network 题解 点双连通分量(求割点数量)

    题目链接:http://poj.org/problem?id=1144 题目大意:给以一个无向图,求割点数量. 这道题目的输入和我们一般见到的不太一样. 它首先输入 \(N\)(\(\lt 100\) ...

  9. [Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分)

    [Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分) 题面 给出一个无向图,以及q条有向路径.问是否存在一种给边定向的方案,使得 ...

随机推荐

  1. LintCode-8.旋转字符串

    旋转字符串 给定一个字符串和一个偏移量,根据偏移量旋转字符串(从左向右旋转) 样例 对于字符串 "abcdefg". offset=0 => "abcdefg&qu ...

  2. iOS-明杰解决字段冲突,及数组映射

    /** 替换关键字的属性名 */ + (NSDictionary *)mj_replacedKeyFromPropertyName{ return @{@"UUID":@" ...

  3. linux线程同步实例

    [Linux多线程]三个经典同步问题 - 神奕的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/lisonglisonglisong/article/details ...

  4. 【Redis】- 安装为windows服务

    1.安装redis服务 echo install redis-server redis-server.exe --service-install redis.windows.conf --loglev ...

  5. Android 布局方式学习

    一.LinearLayout线性布局: 线性布局是程序中最常见的一种布局方式,线性布局可以分为水平线性布局和垂直线性布局两种, 通过android:orientation属性可以设置线性布局的方向 1 ...

  6. Mysql查询优化从入门到跑路(二)数据库查询优化技术总揽

    五大优化技术 1.查询重用 查询重用是指尽可能利用先前的执行结果,以达到节约查询计算全过程的时间并减少资源消耗的目的. 目前查询重用技术主要集中在两个方面:     1)查询结果重用         ...

  7. 【bzoj3437】小P的牧场 斜率优化dp

    题目描述 背景 小P是个特么喜欢玩MC的孩纸... 描述 小P在MC里有n个牧场,自西向东呈一字形排列(自西向东用1…n编号),于是他就烦恼了:为了控制这n个牧场,他需要在某些牧场上面建立控制站,每个 ...

  8. 【bzoj3174】[Tjoi2013]拯救小矮人 贪心+dp

    题目描述 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人,我们知道他从脚 ...

  9. BZOJ4823 CQOI2017老C的方块(最小割)

    如果将其转化为一个更一般的问题即二分图带权最小单边点覆盖(最小控制集)感觉是非常npc的.考虑原题给的一大堆东西究竟有什么奇怪的性质. 容易发现如果与特殊边相邻的两格子都放了方块,并且这两个格子都各有 ...

  10. html的head内标签

    ctrl+?:自动注释 ctrl+/:  注释多行,再按一次,取消注释的多行. 一,*********本地测试的方法:1-找到文件路径,直接浏览器打开:2-pycharm打开测试. 二,模板的解释: ...