题目大意:已知连通图G有N个点m条无向边,有Q次操作,每次操作为增加一条边,问每次操作后图上有几个桥。

如果添加一条边进行Tarjin搜索一次时间复杂度为m*m*q很大,会超时。真的超时,我试过。看了lx学长的题解才

直到有LCA这个东西。LCA算法意思是保存Tarjin搜索树上的父节点和子节点关系,之后对图进行重复操作时不用

再次对图进行搜索,只需要用已经储存的 父节点和子节点关系 进行更新运算即可。这样的时间复杂度为m+q.

附AC代码:

#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
struct ad
{
int to, next, used;
}edge[];
int head[], edge_num, dfn[], low[], bridge_num, Time, father[];
bool isbridge[];
void Add(int x, int y)///邻接表储存
{
edge[edge_num].to = y;
edge[edge_num].next = head[x];
edge[edge_num].used = ;
head[x] = edge_num++;
}
void Init()///预处理
{
memset(head, -, sizeof(head));
memset(low, , sizeof(low));
memset(dfn, , sizeof(dfn));
memset(isbridge, false, sizeof(isbridge));
edge_num = Time = bridge_num = ;
}
void Tarjin(int u, int fa)
{
father[u] = fa;
low[u] = dfn[u] = ++Time;
int i, v;
for(i=head[u]; i!=-; i=edge[i].next)
{
if(edge[i].used==)
{
edge[i].used = edge[i^].used = ;///标记反向边
v = edge[i].to;
if(!dfn[v])
{
Tarjin(v, u);
low[u] = min(low[u], low[v]);
if(low[v]>dfn[u])
{
bridge_num++;
isbridge[v] = true;
}
}
else if(v!=fa)
low[u] = min(low[u], dfn[v]);
}
}
}
void LCA(int u, int v)///利用搜索树的父子节点关系运算
{
if(dfn[u]>dfn[v])///保证u是搜索树上靠下的点,依次向上访问.更新.运算
swap(u, v);
while(dfn[v]>dfn[u])
{
if(isbridge[v])bridge_num--;
isbridge[v] = false;
v = father[v];
} while(u!=v)
{
if(isbridge[u])bridge_num--;
if(isbridge[v])bridge_num--;
isbridge[u] = isbridge[v] = false;
u = father[u];
v = father[v];
}
}
int main()
{
int n, m, icase = ;
while(scanf("%d %d", &n, &m), n+m)
{
int a, b;
Init();
for(int i=; i<=m; i++)
{
scanf("%d %d", &a, &b);
Add(a, b);
Add(b, a);
}
Tarjin(, -);
int Q;
scanf("%d", &Q);
printf("Case %d:\n", icase++);
while(Q--)
{
scanf("%d %d", &a, &b);
LCA(a, b);
printf("%d\n", bridge_num);
}
}
return ;
}

POJ3694 Network的更多相关文章

  1. [POJ3694]Network(Tarjan,LCA)

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

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

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

  3. POJ3694 Network(连通图+LCA)

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

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

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

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

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

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

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

  7. POJ3694 Network【连通分量+LCA】

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

  8. POJ3694 Network - Tarjan + 并查集

    Description 给定$N$个点和 $M$条边的无向联通图, 有$Q$ 次操作, 连接两个点的边, 问每次操作后的图中有几个桥 Solution 首先Tarjan找出边双联通分量, 每个双联通分 ...

  9. POJ3694 Network 边双缩点+LCA+并查集

    辣鸡错误:把dfs和ldfs搞混...QAQ 题意:给定一个无向图,然后查询q次,求每次查询就在图上增加一条边,求剩余割边的个数. 先把边双缩点,然后预处理出LCA的倍增数组: 然后加边时,从u往上跳 ...

随机推荐

  1. ping不通 www.baidu.com 163.com

    可以试试这个命令:netsh winsock reset ping不通,但是可以上网,原因有以下几个: 1.远程主机禁止ping 2.firewall禁止ping,icmp 3.dns解析有问题 fr ...

  2. Python图表绘制:matplotlib绘图库入门

    matplotlib 是Python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中. 它的文档相当完备,并 ...

  3. Jquery数组操作

    jQuery的数组处理,便捷,功能齐全. 最近的项目中用到的比较多,深感实用,一步到位的封装了很多原生js数组不能企及的功能. 最近时间紧迫,今天抽了些时间回过头来看 jQuery中文文档 中对数组的 ...

  4. Abstract和Virtual和interface , 派生类中重写 override / new关键字

    http://www.cnblogs.com/blsong/archive/2010/08/12/1798064.html C#中Abstract和Virtual 在C#的学习中,容易混淆virtua ...

  5. [cross compile]cygwin和mingw

    转自:http://blog.csdn.net/embededvc/article/details/6829010 1. MinGW和CygWin/gcc概念 Unix下编译通过的C代码,在win32 ...

  6. 原生+jquery 实现好看滚动条。

    //原生 <!doctype html> <html> <head> <meta charset="utf-8"> <titl ...

  7. ADF_Controller系列2_绑定TasksFlow、Region和Routers(Part2)

    2015-02-14 Created By BaoXinjian

  8. 命令查看java的class字节码文件、verbose、synchronize、javac、javap

    查看Java字节码 1 javac –verbose查看运行类是加载了那些jar文件 HelloWorld演示: public class Test { public static void main ...

  9. jQuery MiniUI开发系列之:HTML标签配置

    全部使用Javascript写一个界面,是一件很困难的事. 1)要求有较高的Javascript编程能力. 2)会造成“代码树”问题.一级又一级子"children",需要&quo ...

  10. NDK 的开发流程

    1.NDK开发所需要的工具 windows 需要在windows下的环境 把c代码打包成 手机能用的函数库 首先模拟手机的环境 1 NDK .sh linux 批处理文件 .bat windows 头 ...