LCA+tarjan
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相关推荐
- 最近公共祖先 LCA Tarjan算法
来自:http://www.cnblogs.com/ylfdrib/archive/2010/11/03/1867901.html 对于一棵有根树,就会有父亲结点,祖先结点,当然最近公共祖先就是这两个 ...
- hdu 4547(LCA+Tarjan)
解题思路:很明显的LCA问题,用Tarjan离线算法即可.这里输入的可能是字符串,所以直接用map保存.此外,根据题意,这里需要稍稍有点变化,因为cd:a\b\c...这里是一步即可完成,所以在查询a ...
- 洛谷 - P3379 【模板】最近公共祖先(LCA)(RMQ求LCA/Tarjan求LCA)
题目链接:点击查看 题目大意:给出一棵 n 个点组成的有根树,再给出 m 次询问,每次询问需要回答点 x 和点 y 的 lca 题目分析:今天新学了两种蛮有意思的求 LCA 的方法,总结一下四种方法各 ...
- 最近公共祖先(LCA,Tarjan)
一定要耐心慢慢看 Tarjan算法的优点在于相对稳定,时间复杂度也比较居中,也很容易理解. 下面详细介绍一下Tarjan算法的基本思路: 1.任选一个点为根节点,从根节点开始. 2.遍历该点u所有子节 ...
- LCA 朴素算法+树差分倍增+Tarjan算法 三种算法实现c++代码实现
哔哩哔哩up视频:https://www.bilibili.com/video/BV1nE411L7rz?t=379 转载:http 文章目录 树差分 & 倍增LCA Tarjan 朴素算法 ...
- 数据结构课程设计-神秘国度的爱情故事-LCA:tarjan+离线/树链剖分/暴力
1.无脑暴力dfs: O(n*m) 2.LCA/tarjan+离线处理: O(n+m) 3.LCA/树链剖分: O(nlogn+m)~O(nlogn+mlogn) 4.LCA/倍增思想(有空再补) ...
- Tarjan算法_LCA
参考资料:Tarjan算法_LCA tarjan算法求LCA Tarjan 算法&模板 只是对其中的代码进行一下注释,如有错误还得回来再改. //不怕别人比你聪明,就怕别人比你聪明还比你努 ...
- 斯大林格勒拖拉机厂LCA项目研制成功
什么是LCA? 话不多说,同志们先来康康LCA是什么东西.(逃 LCA"光辉"是印度斯坦航空公司(HAL)为满足印度空军需要研制的单座单发轻型全天候超音速战斗攻击机,主要任务是争夺 ...
- 「LuoguP3379」 【模板】最近公共祖先(LCA)
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...
- 图论--最近公共祖先LCA
最近公共祖先LCA LCA(Least Common Ancestors),即最近公共祖先,是指这样一个问题:在有根树中,找出某两个结点u和v最近的公共祖先(另一种说法,离树根最远的公共祖先) 最近公 ...
最新文章
- 【pyQuery】抓取startup news首页
- Python程序设计题解【蓝桥杯官网题库】 DAY9-基础练习
- 第一章:最小可行区块链
- Win11系统下Excel怎么把0变成空白
- ubuntu系统下Jenkins和tomcat的安装与配置
- 找不到visual studio模板信息 解决方法
- 阿里云MVP陈磊:数字化转型驱动业务创新
- Hawk搜索引擎平台0.6.9测试版(提供下载)
- Docker学习总结(19)——Google开源的容器集群管理系统Kubernetes介绍
- 27. 搭建Git服务器
- OPPO R17忘记用户账户密码强制清除登录账号
- python将多个pdf合并并保存书签
- 计算机硬件基础与计算机组装知识总结
- 省时又省力的次世代角色流程也太!香!了!
- 让你5分钟明白美国金融危机爆发的原因!
- 微软卷土重来 只收购雅虎搜索业务
- 30天自制操作系统 学习笔记1
- java程序员要学什么?
- PS案例提升课视频教程
- 04.reactive
热门文章
- 推荐几本lisp的书.
- Windows7磁盘检查与整理的使用
- android入门级智能手表产地,从全球智能手表市场来看,Android智能手表只在中国卖得好...
- python中pickle模块_python中的pickle模块
- php中页面静态化技术,在PHP中实现页面静态化的方法有哪些
- b站用户画像2020_2020年抖音用户画像专栏报告(上)
- php 压缩及解压文件,php zip文件的解压与压缩
- Redis缓存持久化
- 阿里云镜像加速Docker
- 【渝粤教育】广东开放大学 操作系统原理与应用 形成性考核 (46)