一开始题目没看清楚,以为是增加那条边后还有多少桥,所以就当做是无向图tarjan缩点后建树,然后求u,v的最近公共祖先,一直wa。

后来再看题目后才发现边放上去后不会拿下来了,即增加i条边后桥的数量。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int maxn = 100100;
const int maxm = 200100; struct node{
int v,next;
}edge[maxm*2];
int head[maxn],low[maxn],dfn[maxn],fa[maxn],stack[maxn],in[maxn],vis[maxm*2];
int res[maxn][2],depth[maxn],father[maxn];
int n,m,id,clock,top,total,num,q;
void add_edge(int u,int v){
edge[id].v = v;edge[id].next = head[u];head[u] = id++;
edge[id].v = u;edge[id].next = head[v];head[v] = id++;
}
void init(){
memset(head,-1,sizeof(head));
memset(dfn,0,sizeof(dfn));
memset(fa,0,sizeof(fa));
memset(vis,0,sizeof(vis));
id = total = top = clock = num = 0;
int u,v;
while( m-- ){
scanf("%d%d",&u,&v);
add_edge(u,v);
}
}
void tarjan(int u){
low[u] = dfn[u] = ++clock;
stack[top++] = u;in[u] = 1;
for(int id = head[u]; id != -1; id = edge[id].next){
if( vis[id] )continue;//如果边以及走过,则不能再走了
vis[id] = vis[id^1] = 1;//标记边已经走过
int v = edge[id].v;
if(!dfn[v]){
tarjan(v);
if( dfn[u] < low[v])
{//将桥两端的顶点保存下来
res[total][0] = u;
res[total++][1] = v;
}
low[u] = low[v] < low[u] ? low[v] : low[u];
}
else if(in[v] && low[u] > dfn[v])low[u] = dfn[v];
}
if( dfn[u] == low[u]){
++num;//缩点
do{
int v = stack[--top];
fa[v] = num;
in[v] = 0;
}while( u != stack[top]);
}
} void dfs(int u,int dep){//确定个顶点的深度,以及其父亲节点
depth[u] = dep;
vis[u] = 1;
for(int id= head[u]; id != -1; id = edge[id].next){
int v = edge[id].v;
if(vis[v])continue;
father[v] = u;
dfs(v,dep+1);
}
}
int find(int x,int y){//递归找x,y的最近公共祖先
if(x == y)return x;
if(depth[x] > depth[y] )
{
if(!vis[x])total --;//当x所连的点为桥时,桥的数量减1
vis[x] = 1;
return find(father[x],y);
}
if(!vis[y])total --;
vis[y] = 1;
return find(x,father[y]);
}
void solve(){
int i;
tarjan(1);
int u,v;
memset(head,-1,sizeof(head));
id= 0;
for( i = 0 ; i < total; i++){//建树
u = fa[res[i][0]], v = fa[res[i][1]];
add_edge(u,v);
}
memset(vis,0,sizeof(vis));
father[1] = 1;
dfs(1,1);
}
int main(){
int u,v;
// freopen("in.txt","r",stdin);
int cas = 1;
while(~scanf("%d%d",&n,&m),n&&m){
init();
solve();
scanf("%d",&q);
printf("Case %d:\n",cas++);
memset(vis,0,sizeof(vis));
for(int i = 1; i <= q; i ++)
{
scanf("%d%d",&u,&v);
u = fa[u];v = fa[v];
find(u,v);
printf("%d\n",total);
}
puts("");
}
return 0;
}

  

POJ 3694 Network 无向图双联通+LCA的更多相关文章

  1. poj 3694 Network 边双连通+LCA

    题目链接:http://poj.org/problem?id=3694 题意:n个点,m条边,给你一个连通图,然后有Q次操作,每次加入一条边(A,B),加入边后,问当前还有多少桥,输出桥的个数. 解题 ...

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

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

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

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

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

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

  5. poj 3694 Network(双连通分量)

    题目:http://poj.org/problem?id=3694 #include <iostream> #include <cstring> #include <cs ...

  6. POJ 3694 Network(Tarjan求割边+LCA)

    Network Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 10969   Accepted: 4096 Descript ...

  7. hdu 2460 poj 3694 (双联通+LCA)

    在给出的两个点上加一条边,求剩下桥的数量,,不会LCA在线,就用了最普通的,先Tarjan双联通缩点,然后将缩完的图建成一棵树,树的所有边就是桥了,如果在任意两点间加一条边的话,那么从两点到最近公共祖 ...

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

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

  9. POJ 3694Network(Tarjan边双联通分量 + 缩点 + LCA并查集维护)

    [题意]: 有N个结点M条边的图,有Q次操作,每次操作在点x, y之间加一条边,加完E(x, y)后还有几个桥(割边),每次操作会累积,影响下一次操作. [思路]: 先用Tarjan求出一开始总的桥的 ...

随机推荐

  1. python 感悟

    * 优美胜于丑陋.* 显式胜于隐式.* 简单胜于复杂.* 复杂胜于难懂.* 扁平胜于嵌套.* 稀疏胜于紧密.* 可读性应当被重视.* 尽管实用性会打败纯粹性,特例也不能凌驾于规则之上.* 不要忽略任何 ...

  2. 使用Kubeadm创建k8s集群之节点部署(三十一)

    前言 本篇部署教程将讲述k8s集群的节点(master和工作节点)部署,请先按照上一篇教程完成节点的准备.本篇教程中的操作全部使用脚本完成,并且对于某些情况(比如镜像拉取问题)还提供了多种解决方案.不 ...

  3. poj 2524 Ubiquitous Religions(简单并查集)

    对与知道并查集的人来说这题太水了,裸的并查集,如果你要给别人讲述并查集可以使用这个题当做例题,代码中我使用了路径压缩,还是有一定优化作用的. #include <stdio.h> #inc ...

  4. AUTOSAR学习之RTE - 可运行实体

    本文介绍RTE的运行体(runnable). An AUTOSAR component defines one or more "runnable entities". A run ...

  5. (通俗易懂小白入门)网络流最大流——EK算法

    网络流 网络流是模仿水流解决生活中类似问题的一种方法策略,来看这么一个问题,有一个自来水厂S,它要向目标T提供水量,从S出发有不确定数量和方向的水管,它可能直接到达T或者经过更多的节点的中转,目前确定 ...

  6. kube-scheduler源码分析

    kubernetes集群三步安装 kube-scheduler源码分析 关于源码编译 我嫌弃官方提供的编译脚本太麻烦,所以用了更简单粗暴的方式编译k8s代码,当然官方脚本在编译所有项目或者夸平台编译以 ...

  7. 单机版ZooKeeper的安装教程

    之前一直没有时间去整理,现在抽出几分钟时间整理以下,有问题的在评论区留言即可. 前期准备JDK环境(ZK需要jdk进行编译,本文以jdk1.8.0_211为例).Linux系统(本文以Centos7为 ...

  8. 神奇的 SQL 之温柔的陷阱 → 三值逻辑 与 NULL !

    前言 开心一刻   一个中国小孩参加国外的脱口秀节目,因为语言不通,于是找了一个翻译. 主持人问:“Who is your favorite singer ?” 翻译:”你最喜欢哪个歌手啊 ?” 小孩 ...

  9. 02、安装Linux系统

    1.我们打开VM软件,然后点击“创建新的虚拟机”,选择“经典”选项 2.选中“稍后安装操作系统”单选按钮,然后单击“下一步”按钮 3.将客户机操作系统的类型选择为“Linux”,版本为"Re ...

  10. git:将代码提交到远程仓库(码云)

    初始化 进入一个任意的文件夹(如D:\aqin_test1\) git init # 初始化,让git将这个文件夹管理起来 git add . # 收集此文件夹下的所有文件 git config -- ...