http://poj.org/problem?id=3694

给一副图,(可能有环,但联通)然后给定q次询问,每次询问的u,v是要加上去的边,问加上去后,若图的边联通度还是1时,有多少条桥

利用并查集缩点,先用tarjan求出总的桥的数量;

利用tarjan中的dfn来找每次u,v的LCA,u到v路径就会成为一个环(记得在跳找LCA时遇到桥标记要取消标记,因为已成环了嘛);

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int M=2e5+5;
struct node{int u,v,nextt;
}e[M<<1];
int ans,tot,cnt,low[M],dfn[M],head[M],vis[M],qiao[M],fa[M];
void addedge(int u,int v){e[tot].v=v;e[tot].nextt=head[u];head[u]=tot++;e[tot].v=u;e[tot].nextt=head[v];head[v]=tot++;
}
void dfs(int u,int f){vis[u]=1;dfn[u]=low[u]=++cnt;for(int i=head[u];~i;i=e[i].nextt){int v=e[i].v;if(!vis[v]){dfs(v,u);fa[v]=u;low[u]=min(low[u],low[v]);if(low[v]>dfn[u]){ans++;qiao[v]=1;}}else if(vis[v]==1&&v!=f){low[u]=min(low[u],dfn[v]);}}vis[u]=2;
}
int LCA(int u,int v){int ans=0;while(dfn[u]>dfn[v]){if(qiao[u]){qiao[u]=0;ans++;}u=fa[u];}while(dfn[v]>dfn[u]){if(qiao[v]){qiao[v]=0;ans++;}v=fa[v];}while(u!=v){if(qiao[u]){qiao[u]=0;ans++;}if(qiao[v]){qiao[v]=0;ans++;}u=fa[u];v=fa[v];}return ans;}
int n,m;
void init(){cnt=tot=0;memset(head,-1,sizeof(head));memset(qiao,0,sizeof(qiao));memset(vis,0,sizeof(vis));memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));for(int i=0;i<=n;i++)fa[i]=i;}
int main(){int sign=1;while(~scanf("%d%d",&n,&m)){if(n==0&&m==0)break;init();for(int i=1;i<=m;i++){int u,v;scanf("%d%d",&u,&v);addedge(u,v);}ans=0;dfs(1,1);int k;scanf("%d",&k);printf("Case %d:\n",sign++);for(int i=1;i<=k;i++){int u,v;scanf("%d%d",&u,&v);ans-=LCA(u,v);printf("%d\n",ans);}putchar('\n');}return 0;
}

View Code

转载于:https://www.cnblogs.com/starve/p/11156840.html

LCA+tarjan相关推荐

  1. 最近公共祖先 LCA Tarjan算法

    来自:http://www.cnblogs.com/ylfdrib/archive/2010/11/03/1867901.html 对于一棵有根树,就会有父亲结点,祖先结点,当然最近公共祖先就是这两个 ...

  2. hdu 4547(LCA+Tarjan)

    解题思路:很明显的LCA问题,用Tarjan离线算法即可.这里输入的可能是字符串,所以直接用map保存.此外,根据题意,这里需要稍稍有点变化,因为cd:a\b\c...这里是一步即可完成,所以在查询a ...

  3. 洛谷 - P3379 【模板】最近公共祖先(LCA)(RMQ求LCA/Tarjan求LCA)

    题目链接:点击查看 题目大意:给出一棵 n 个点组成的有根树,再给出 m 次询问,每次询问需要回答点 x 和点 y 的 lca 题目分析:今天新学了两种蛮有意思的求 LCA 的方法,总结一下四种方法各 ...

  4. 最近公共祖先(LCA,Tarjan)

    一定要耐心慢慢看 Tarjan算法的优点在于相对稳定,时间复杂度也比较居中,也很容易理解. 下面详细介绍一下Tarjan算法的基本思路: 1.任选一个点为根节点,从根节点开始. 2.遍历该点u所有子节 ...

  5. LCA 朴素算法+树差分倍增+Tarjan算法 三种算法实现c++代码实现

    哔哩哔哩up视频:https://www.bilibili.com/video/BV1nE411L7rz?t=379 转载:http 文章目录 树差分 & 倍增LCA Tarjan 朴素算法 ...

  6. 数据结构课程设计-神秘国度的爱情故事-LCA:tarjan+离线/树链剖分/暴力

    1.无脑暴力dfs:   O(n*m) 2.LCA/tarjan+离线处理: O(n+m) 3.LCA/树链剖分: O(nlogn+m)~O(nlogn+mlogn) 4.LCA/倍增思想(有空再补) ...

  7. Tarjan算法_LCA

    参考资料:Tarjan算法_LCA  tarjan算法求LCA  Tarjan 算法&模板 只是对其中的代码进行一下注释,如有错误还得回来再改. //不怕别人比你聪明,就怕别人比你聪明还比你努 ...

  8. 斯大林格勒拖拉机厂LCA项目研制成功

    什么是LCA? 话不多说,同志们先来康康LCA是什么东西.(逃 LCA"光辉"是印度斯坦航空公司(HAL)为满足印度空军需要研制的单座单发轻型全天候超音速战斗攻击机,主要任务是争夺 ...

  9. 「LuoguP3379」 【模板】最近公共祖先(LCA)

    题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...

  10. 图论--最近公共祖先LCA

    最近公共祖先LCA LCA(Least Common Ancestors),即最近公共祖先,是指这样一个问题:在有根树中,找出某两个结点u和v最近的公共祖先(另一种说法,离树根最远的公共祖先) 最近公 ...

最新文章

  1. 【pyQuery】抓取startup news首页
  2. Python程序设计题解【蓝桥杯官网题库】 DAY9-基础练习
  3. 第一章:最小可行区块链
  4. Win11系统下Excel怎么把0变成空白
  5. ubuntu系统下Jenkins和tomcat的安装与配置
  6. 找不到visual studio模板信息 解决方法
  7. 阿里云MVP陈磊:数字化转型驱动业务创新
  8. Hawk搜索引擎平台0.6.9测试版(提供下载)
  9. Docker学习总结(19)——Google开源的容器集群管理系统Kubernetes介绍
  10. 27. 搭建Git服务器
  11. OPPO R17忘记用户账户密码强制清除登录账号
  12. python将多个pdf合并并保存书签
  13. 计算机硬件基础与计算机组装知识总结
  14. 省时又省力的次世代角色流程也太!香!了!
  15. 让你5分钟明白美国金融危机爆发的原因!
  16. 微软卷土重来 只收购雅虎搜索业务
  17. 30天自制操作系统 学习笔记1
  18. java程序员要学什么?
  19. PS案例提升课视频教程
  20. 04.reactive

热门文章

  1. 推荐几本lisp的书.
  2. Windows7磁盘检查与整理的使用
  3. android入门级智能手表产地,从全球智能手表市场来看,Android智能手表只在中国卖得好...
  4. python中pickle模块_python中的pickle模块
  5. php中页面静态化技术,在PHP中实现页面静态化的方法有哪些
  6. b站用户画像2020_2020年抖音用户画像专栏报告(上)
  7. php 压缩及解压文件,php zip文件的解压与压缩
  8. Redis缓存持久化
  9. 阿里云镜像加速Docker
  10. 【渝粤教育】广东开放大学 操作系统原理与应用 形成性考核 (46)