题意:给n个点和m条边,再给出q条边,问每次加一条边以后剩下多少桥。

  分析:这题是结合了LCA和dfn的妙用。_dfn数组和dfn的意义不一样,并非访问的时间戳,_dfn表示的是被访问的顺序,而且是多线程访问下的顺序,举个例子,同一个点分岔开来的点,距离这个点相同距离的点,他们的_dfn的值是相同的,而dfn不是,类似于单线程dfs访问的各点的dfn值是不同的。

  具体见代码:  

 #include <stdio.h>
#include <algorithm>
#include <string.h>
#include <map>
#include <vector>
#include <queue>
using namespace std;
const int N = + ; int n,m,tot,head[N],cnt,dfs_clock,dfn[N],_dfn[N],root[N],low[N];
bool bridge[N];
struct edge
{
int nxt,v;
}edges[N<<]; void init()
{
tot = ,dfs_clock = ,cnt = ;
memset(head,-,sizeof(head));
memset(dfn,,sizeof(dfn));
memset(_dfn,,sizeof(_dfn));
memset(bridge,false,sizeof(bridge));
for(int i=;i<=n;i++) root[i] = i;
} void addEdge(int u,int v)
{
edges[tot] = (edge){head[u],v};
head[u] = tot ++;
edges[tot] = (edge){head[v],u};
head[v] = tot ++;
} void tarjan(int u)
{
dfn[u] = low[u] = ++dfs_clock;
_dfn[u] = _dfn[root[u]] + ;
for(int i=head[u];i!=-;i=edges[i].nxt)
{
edge &e = edges[i];
int v = e.v;
if(!dfn[v])
{
root[v] = u;
tarjan(v);
low[u] = min(low[u],low[v]);
if(low[v] > dfn[u])
{
cnt ++;
bridge[v] = true;
}
}
else if(dfn[v] < dfn[u] && v!=root[u]) low[u] = min(low[u],dfn[v]);
}
} void LCA(int u,int v)
{
while(_dfn[u] > _dfn[v])
{
if(bridge[u])
{
cnt --;
bridge[u] = false;
}
u = root[u];
}
while(_dfn[u] < _dfn[v])
{
if(bridge[v])
{
cnt --;
bridge[v] = false;
}
v = root[v];
}
while(u != v)
{
if(bridge[u])
{
cnt --;
bridge[u] = false;
}
if(bridge[v])
{
cnt --;
bridge[v] = false;
}
u = root[u];
v = root[v];
}
} void solve()
{
for(int i=;i<=n;i++) if(!dfn[i]) tarjan(i); int q;scanf("%d",&q);
while(q--)
{
int u,v;scanf("%d%d",&u,&v);
LCA(u,v);
printf("%d\n",cnt);
}
puts("");
} int main()
{
int kase = ;
while(scanf("%d%d",&n,&m)==)
{
if(n== && m==) break;
init();
printf("Case %d:\n",kase++);
while(m--)
{
int u,v;scanf("%d%d",&u,&v);
addEdge(u,v);
}
solve();
}
}

POJ 3694 Network ——(桥 + LCA)的更多相关文章

  1. POJ 3694 Network (tarjan + LCA)

    题目链接:http://poj.org/problem?id=3694 题意是给你一个无向图n个点,m条边,将m条边连接起来之后形成一个图,有Q个询问,问将u和v连接起来后图中还有多少个桥. 首先用t ...

  2. poj 3694 Network(割边+lca)

    题目链接:http://poj.org/problem?id=3694 题意:一个无向图中本来有若干条桥,有Q个操作,每次加一条边(u,v),每次操作后输出桥的数目. 分析:通常的做法是:先求出该无向 ...

  3. POJ 3694 tarjan 桥+lca

    Network Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 7298   Accepted: 2651 Descripti ...

  4. Poj 3694 Network (连通图缩点+LCA+并查集)

    题目链接: Poj 3694 Network 题目描述: 给出一个无向连通图,加入一系列边指定的后,问还剩下多少个桥? 解题思路: 先求出图的双连通分支,然后缩点重新建图,加入一个指定的边后,求出这条 ...

  5. poj 3417 Network(tarjan lca)

    poj 3417 Network(tarjan lca) 先给出一棵无根树,然后下面再给出m条边,把这m条边连上,然后每次你能毁掉两条边,规定一条是树边,一条是新边,问有多少种方案能使树断裂. 我们设 ...

  6. POJ 3694——Network——————【连通图,LCA求桥】

    Network Time Limit:5000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Stat ...

  7. POJ 3694 Network (求桥,边双连通分支缩点,lca)

    Network Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5619   Accepted: 1939 Descripti ...

  8. POJ 3694 Network(无向图求桥+重边处理+LCA)

    题目大意: 给你一个无向图,然后再给你一个Q代表有Q次询问,每一次加一条边之后还有几座桥.在这里要对重边进行处理. 每次加入一条边之后,在这条搜索树上两个点的公共祖先都上所有点的桥都没了. 这里重边的 ...

  9. POJ 3694 Network(并查集缩点 + 朴素的LCA + 无向图求桥)题解

    题意:给你一个无向图,有q次操作,每次连接两个点,问你每次操作后有几个桥 思路:我们先用tarjan求出所有的桥,同时我们可以用并查集缩点,fa表示缩点后的编号,还要记录每个节点父节点pre.我们知道 ...

随机推荐

  1. X-Router软路由设置

    一 内网:     ip   192.168.0.1      掩码  255.255.255.0      网关   (空)     DNS   202.96.128.68(佛山的)手动写入 二 外 ...

  2. WCF寄宿windows服务一

    如果只是寄宿单个wcf服务,方法很简单,步骤:1.创建好一个windows服务.关于windows服务内容见:http://www.cnblogs.com/zhaow/p/7866916.html2. ...

  3. JS基础_基本数据类型和引用数据类型

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. JS基础_属性名和属性值

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. [转载]flex中的正则表达式

    原文:https://blog.csdn.net/hczhiyue/article/details/20483209 (1)单字符匹配* ‘x’ 匹配字符 x.* ‘.’ 匹配任意一个字符(字节),除 ...

  6. ubuntu下安装python-selenuim自动化测试的谷歌浏览器驱动安装的位置

    谷歌插件下载地址 https://npm.taobao.org/mirrors/chromedriver selenium下载地址 https://pypi.org/simple/selenium/ ...

  7. jquery文件上传版 插件

    /*! * jQuery Form Plugin * version: 4.2.2 * Requires jQuery v1.7.2 or later * Project repository: ht ...

  8. css高度居中

    1.已知元素高度 // 子盒子 #div1{ width:200px; height:200px; position: absolute; //父元素需要相对定位 top: 50%; left: 50 ...

  9. 逆向破解 H.Koenig 遥控器 Part 1

    逆向破解 H.Koenig 遥控器(Part 1)   最近我正在尝试一研究些自动吸尘器机器人.iRobot公司的Roomba貌似是该领域的领导者,但是作为实验来讲的话这些东西真是太昂贵了,我也找不到 ...

  10. deep_learning_Function_sklearn.preprocessing.LabelBinarizer()

    在多数的机器学习比赛中,给出的标签都是非数字化的,所以我们需要对其进行转换.代码如下: from sklearn import preprocessing feature = [[0,1], [1,1 ...