题意:

一个无向图可以有重边,下面q个操作,每次在两个点间连接一条有向边,每次连接后整个无向图还剩下多少桥(注意是要考虑之前连了的边,每次回答是在上一次的基础之上)。

思路:

首先运行一次Tarjan,求出桥和缩点,那么远无向图将缩点为一棵树,树边正好是原来的桥。每次连接两点,看看这两点是不是在同一个缩点内,如果是,那么缩点后的树没任何变化,如果两点属于不同的缩点,那么连接起来,然后找这两个缩点的LCA,因为从点u到LCA再到点v再到点u,将形成环,里面的树边都会变成不是桥。计数的时候注意,有些树边可能之前已经被标记了,这次再经过不能再标记。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector> using namespace std;
#define N 100010
#define M 200010 vector<int> ver[N];
int head[N],dfn[N],low[N],vis[N],fa[N],dcnt,bcnt; struct edge{
int u,v,used,next;
}e[*M]; bool isbridge[N]; inline void add(int u, int v ,int &k)
{
e[k].v = v; e[k].used = ;
e[k].next = head[u]; head[u] = k++;
} void LCA(int u,int v)
{
if(dfn[u] < dfn[v]) swap(u,v);
while(dfn[u] > dfn[v])
{
if(isbridge[u]) bcnt--;
isbridge[u] = false;
u = fa[u];
}
while(u!=v)
{
if(isbridge[u]) bcnt--;
if(isbridge[v]) bcnt--;
isbridge[u] = isbridge[v] = false;
u = fa[u]; v = fa[v];
}
} void dfs(int u)
{
vis[u] = ; dfn[u] = low[u] = ++dcnt;
for(int k=head[u]; k!=-; k=e[k].next)
if(!e[k].used)
{
e[k].used = e[k^].used = ;
int v = e[k].v;
if(!vis[v])
{
fa[v] = u;
dfs(v);
low[u] = min(low[u] , low[v]);
if(dfn[u] < low[v])
{ bcnt++; isbridge[v] = true; }
}
else if(vis[v] == ) low[u] = min(low[u],dfn[v]);
}
vis[u] = ;
} int main()
{
int n,m,q,cas=;
while(cin>>n>>m,n,m)
{
memset(head,-,sizeof(head));
int k = ;
for(int i=; i<m; i++)
{
int u,v;
cin>>u>>v;
add(u,v,k);
add(v,u,k);
}
memset(isbridge,false,sizeof(isbridge));
memset(vis,,sizeof(vis));
dcnt = bcnt = ;
fa[] = ;
dfs();
printf("Case %d:\n",++cas);
cin>>q;
while(q--)
{
int u,v;
cin>>u>>v;
LCA(u,v);
cout<<bcnt<<endl;
}
cout<<endl;
}
return ;
}

POJ3694 Network【连通分量+LCA】的更多相关文章

  1. [POJ3694]Network(LCA, 割边, 桥)

    题目链接:http://poj.org/problem?id=3694 题意:给一张图,每次加一条边,问割边数量. tarjan先找出所有割边,并且记录每个点的父亲和来自于哪一条边,然后询问的时候从两 ...

  2. [POJ3694]Network(Tarjan,LCA)

    [POJ3694]Network Description A network administrator manages a large network. The network consists o ...

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

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

  4. poj 3417 Network(tarjan lca)

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

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

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

  6. Network(POJ3694+边双连通分量+LCA)

    题目链接:http://poj.org/problem?id=3694 题目: 题意:给你一个n个点m条边的无向连通图,进行q次操作,每次操作在u和v之间加一条边,问每次操作之后“桥”的数量. 思路: ...

  7. POJ3694 Network —— 边双联通分量 + 缩点 + LCA + 并查集

    题目链接:https://vjudge.net/problem/POJ-3694 A network administrator manages a large network. The networ ...

  8. POJ3694 Network(Tarjan双联通分图 LCA 桥)

    链接:http://poj.org/problem?id=3694 题意:给定一个有向连通图,每次增加一条边,求剩下的桥的数量. 思路: 给定一个无向连通图,添加一条u->v的边,求此边对图剩余 ...

  9. POJ3694 Network(连通图+LCA)

    题目链接:http://poj.org/problem?id=3694 题目大意:给定一个图,每次添加一条边(可能有重边).输出每次添加后桥的 数目.由于添加边的次数比较多,添加一次Tarjin一次明 ...

随机推荐

  1. html css類和css()

    addClass():一個或者多個元素添加一個或者多個類 $("元素一,元素2,元素3").addClass(“類名1  類名2”) removeClass():一個或者多個元素刪 ...

  2. CPU性能过剩提升乏力影响未来行业发展吗?

    导读 虽然CPU仍然在不断发展,但是它的性能已经不再仅仅受限于单个处理器类型或制造工艺上了.和过去相比,CPU性能提升的步伐明显放缓了,接下来怎么办,成为横亘在整个行业面前的大问题. 虽然CPU仍然在 ...

  3. BZOJ1283 序列(费用流)

    不妨看做是先用k个指针指向被选择的前k个元素,然后每次将选中当前第一个元素的指针移到最后,并且需要满足位置变化量>=m.显然这样可以构造出所有的合法方案.那么可以以此建立费用流模型,以一条流量k ...

  4. BZOJ4836 二元运算(分治FFT)

    设A(n)为a中n的个数,B(n)为b中n的个数.如果只考虑加法显然是一个卷积,减法翻转一下也显然是一个卷积. 问题在于两者都有.容易想到分开处理.那么可以考虑分治.即对于值域区间[l,r],分别计算 ...

  5. BZOJ5334 [TJOI2018] 数学计算 【线段树分治】

    题目分析: 大概是考场上的签到题.首先mod不是质数,所以不能求逆元.注意到有加入操作和删除操作.一个很典型的想法就是线段树分治.建立时间线段树然后只更改有影响的节点,最后把所有标记下传.时间复杂度是 ...

  6. POJ 1661 (Help Jimmy )

    Help Jimmy Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13669   Accepted: 4541 Descr ...

  7. MT【20】一道三次函数的难题

    评:这道题由于系数弄得不是很好,涉及的难度为联赛一试+难度.中间用到了$Sturm$定理,还涉及到一些代 数变形技巧,最后一个求关于$m$的三次方程又涉及到三次方程的求法.一个小时讲这一道题也不为过.

  8. Python入门基础之循环

    如果计算机不能循环,那么它比人还笨,实际上它也确实比人笨.你之所以觉得计算机好厉害,是因为它快,guangzhoushenbo.com计算机可以在1秒钟内重复做一件事情成千上万次. Python学习交 ...

  9. Leetcode 326.3的幂 By Python

    给定一个整数,写一个函数来判断它是否是 3 的幂次方. 示例 1: 输入: 27 输出: true 示例 2: 输入: 0 输出: false 示例 3: 输入: 9 输出: true 示例 4: 输 ...

  10. THUWC2019 摸鱼记

    Day1 菜狗选手无人权,衣服没有海星,狗牌手写全糊,餐票不发刷卡,住宿自理宾馆. 人菜没办法. 感受到了自己智商低 不想写了 想原地退役 不知道还要不要走下去