题意:给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. HttpWorkerRequest应用简介

    1. Using HttpWorkerRequest for getting headers1.使用HttpWorkerRequest获取headers信息 First, the HttpWorker ...

  2. js之语句(条件语句,循环语句,跳转语句)

    一.条件语句 1.if语句 条件语句是通过判断指定表达式的值来决定执行还是跳过某些语句,这些语句是代码是“决策点”有时称之为“分支”. if语句是一种基本的控制语句,它让Javascript程序可以选 ...

  3. js之语句(表达式语句,复合语句,声明语句)

    语句就是JavaScript整句或命令,以分号结束,用来执行以使某件事发生.下面将介绍三种语句:表达式语句,复合语句,声明语句. 一.表达式语句 表达式语句是javascript中最简单的语句 < ...

  4. day06 Python class基础篇

    一.目录 1.类与对象的概述 2.封装 3.继承 4.多态 5.类的成员 6.类与类之间的关系 7.私有 二. 内容讲解 一.类与对象的概述 类是对一系列具有相同属性的事物的抽象,相同于设计图纸,而对 ...

  5. Idea格式化快捷键无效,没反应

    Idea格式化快捷键无效,没反应 1,关闭网易云音乐快捷键 2,修改搜狗输入法快捷键 目前本人只遇到过这两种

  6. 在Windows server 2019 Core 版本上安装SQL2016

    安装系统后,通过网络等方式先把安装ISO的文件copy过来,虚拟机则用挂一个虚拟光驱即可,然后cd进入目录,执行以下命名即可安装核心服务了: Setup.exe /qs /ACTION=Install ...

  7. ANSIBLE自动化管理工具

    ansible 基础 自动化运维工具 官网:https://www.ansible.com/ 官方文档:https://docs.ansible.com/ ansible 特性 1. 模块化:调用特定 ...

  8. Hadoop_05_运行 Hadoop 自带 MapReduce程序

    1. MapReduce使用 MapReduce是Hadoop中的分布式运算编程框架,只要按照其编程规范,只需要编写少量的业务逻辑代码即可实现 一个强大的海量数据并发处理程序 2. 运行Hadoop自 ...

  9. python基础:python循环、三元运算、字典、文件操作

    目录: python循环 三元运算 字符串 字典 文件操作基础 一.python编程 在面向过程式编程语言的执行流程中包含: 顺序执行 选择执行 循环执行 if是条件判断语句:if的执行流程属于选择执 ...

  10. angular流程引擎集成

    工作流在oa和erp中十分常见,现有成熟的工作流通常是在客户端实现的,web实现工作流的案例十分稀少.要实现web工作流必须要有强大的流程设计器,这里为大家介绍一款基于angular的流程控件,其功能 ...