poj 3694 Network 【Tarjan】+【LCA】
<题目链接>
题目大意:
给一个无向图,该图只有一个连通分量。然后查询q次,q < 1000, 求每次查询就增加一条边,求剩余桥的个数。
解题分析:
普通的做法就是在每加一条边后,都找一次桥,但是这样肯定超时。
第一种做法是:缩点,因为如果一条边不是桥那么无论怎么加边他肯定都不会变成桥,这样把连通分量缩成一个点。这样全图所有的边就都是桥,这样的话,我们就在加的边里面去找如果加的边是同一个点,那么,肯定不会减少桥,但是如果不是同一个,那么桥肯定减少。
还有一种做法:因为需要u、v之间直接连一条边,所以u->v的原始路径与新连的这条边构成一个环,所以u->v原始路径上的所有桥将不复存在。我们可以先利用Tarjan处理出原图中所有的桥,然后再利用LCA将u->v原始路径的每一条边都求出来(求出u到LCA的所有边和v到LCA的所有边),然后判断该边是否是桥即可,如果是桥,则删除该边的桥标记即可。
下面介绍第二种做法:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; #define clr(a,b) memset(a,b,sizeof(a))
const int N = 1e5+;
const int M = 4e5+;
int n,m,q,tot,index,bridge;
int dfn[N],low[N],fa[N],dep[N],head[N];
bool cut[N];
struct Edge{
int to,next;
}edge[M];
void init(){
tot=bridge=index=;
clr(head,-);clr(dfn,);clr(dep,);clr(cut,false);
}
void addedge(int u,int v){
edge[tot].to=v,edge[tot].next=head[u];
head[u]=tot++;
}
void tarjan(int u,int pre){
dfn[u]=low[u]=++index;
dep[u]=dep[pre]+; //dep代表该点深度
for(int i=head[u]; i!=-; i=edge[i].next){
int v=edge[i].to;
if(v==pre) continue;
if(!dfn[v]){
fa[v]=u;
tarjan(v,u);
low[u]=min(low[u],low[v]);
if(low[v]>dfn[u]){ //桥的判定定理
cut[v]=; //标记v所在边为桥
bridge++;
}
}
else
low[u]=min(low[u],dfn[v]);
}
}
void LCA(int u,int v){ //利用LCA将u->v原始路径上的所有桥全部删除
if(dep[u]<dep[v]) swap(u,v);
while(dep[u]>dep[v]){ //将u跳到与v深度相同,将路径上碰到的桥全部删除
if(cut[u]){
bridge--;
cut[u]=false;
}
u=fa[u];
}
while(u!=v){ //将u和v同时跳到他们的LCA,在路径中,凡是碰到桥,将该桥删除
if(cut[u]){
bridge--;
cut[u]=false;
}
if(cut[v]){
bridge--;
cut[v]=false;
}
u=fa[u],v=fa[v];
}
}
int main(){
int ncase=;
while(~scanf("%d%d",&n,&m) && (n||m)){
init();
for(int i=; i<=m; i++){
int u,v;scanf("%d%d",&u,&v);
addedge(u,v);addedge(v,u);
}
tarjan(,); //预处理出原图中所有的桥
scanf("%d",&q);
printf("Case %d:\n",++ncase);
while(q--){
int u,v;scanf("%d%d",&u,&v);
LCA(u,v); //u,v之间连一条边,则改变与u->v的原始路径构成环,所以u->v原始路径上的所有桥将不复存在
printf("%d\n",bridge);
}puts("");
}
return ;
}
2018-11-06
poj 3694 Network 【Tarjan】+【LCA】的更多相关文章
- 【HDOJ2586】【Tarjan离线求LCA】
http://acm.hdu.edu.cn/showproblem.php?pid=2586 How far away ? Time Limit: 2000/1000 MS (Java/Others) ...
- Poj 3694 Network (连通图缩点+LCA+并查集)
题目链接: Poj 3694 Network 题目描述: 给出一个无向连通图,加入一系列边指定的后,问还剩下多少个桥? 解题思路: 先求出图的双连通分支,然后缩点重新建图,加入一个指定的边后,求出这条 ...
- POJ 3694——Network——————【连通图,LCA求桥】
Network Time Limit:5000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Stat ...
- POJ 3694 Network (tarjan + LCA)
题目链接:http://poj.org/problem?id=3694 题意是给你一个无向图n个点,m条边,将m条边连接起来之后形成一个图,有Q个询问,问将u和v连接起来后图中还有多少个桥. 首先用t ...
- poj 3694 Network : o(n) tarjan + O(n) lca + O(m) 维护 总复杂度 O(m*q)
/** problem: http://poj.org/problem?id=3694 问每加一条边后剩下多少桥 因为是无向图,所以使用tarjan缩点后会成一棵树并维护pre数组 在树上连一条边(a ...
- POJ 1470 Closest Common Ancestors【近期公共祖先LCA】
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013912596/article/details/35311489 题目链接:http://poj ...
- POJ 3694 Network(Tarjan求割边+LCA)
Network Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10969 Accepted: 4096 Descript ...
- poj 3694 Network(割边+lca)
题目链接:http://poj.org/problem?id=3694 题意:一个无向图中本来有若干条桥,有Q个操作,每次加一条边(u,v),每次操作后输出桥的数目. 分析:通常的做法是:先求出该无向 ...
- 【HDOJ4635】【Tarjan缩点+思维】【经典】
http://acm.hdu.edu.cn/showproblem.php?pid=4635 Strongly connected Time Limit: 2000/1000 MS (Java/Oth ...
随机推荐
- Confluence 6 MySQL 3.x 字符集编码问题
MySQL 3.x is 已知在大写和小写转换的时候有些问题(non-ASCII). 问题诊断 请按照 Troubleshooting Character Encodings 页面中的内容对问题进行诊 ...
- Confluence 6 配置服务器基础地址备注
使用不同 URL.如果你配置了不同的基础 URL 地址或者你站点的访问者使用了不同的 URL 地址来访问你的 Confluence 地址,你有很大概率可能会受到错误信息. 修改上下文地址.如果你修改了 ...
- 9.jexus 配置ssl
这里非常感谢宇内流云,这是他的博客http://www.cnblogs.com/yunei/. 1,运行环境 CentOS7 jexus5.8.2.9(独立版) jexus 的下载地址 https:/ ...
- Python基础之面向对象进阶一
一.isinstance(obj,cls)和issubclass(sub,super) 1.isinstance(obj,cls)检查obj是否是类 cls 的对象 class A: pass obj ...
- 状态压缩dp小结
最近一段时间算是学了一些状态压缩的题目,在这里做个小结吧 首先是炮兵布阵类题目,这类题目一开始给定一个矩形,要求在上面放置炮兵,如果在一格放了炮兵那么周围的某些格子就不能放炮兵,求最大能放置炮兵的数量 ...
- linux更好看的top界面htop
top命令界面 性能测试时会经常用到top命令百用百顺就是样式不太美,下面介绍htop一个看起来更漂亮的top界面 安装htop yum install htop 安装完成键入htop命令,这样看起来 ...
- spring cloud Hystix熔断机制--基本熔断配置和Fegin client熔断配置
所谓的熔断机制和日常生活中见到电路保险丝是非常相似的,当出现了问题之后,保险丝会自动烧断,以保护我们的电器, 那么如果换到了程序之中呢? 当现在服务的提供方出现了问题之后整个的程序将出现错误的信息显示 ...
- jquery 笔记 点击周围区域子类隐藏,点击子类内部的信息 不隐藏
zilei.click(ev){ var e = ev||event; e.stopPropagation(); //dosomething } $(document).click(function( ...
- 【转】asp.net Core 系列【二】—— 使用 ASP.NET Core 和 VS2017 for Windows 创建 Web API
在本教程中,将生成用于管理“待办事项”列表的 Web API. 不会生成 UI. 概述 以下是将创建的 API: API 描述 请求正文 响应正文 GET /api/todo 获取所有待办事项 无 待 ...
- vue 引入Element组件
1.打开cmd,在当前目录中运行: npm i element-ui -S 2.src/main.js(红色的) import Vue from 'vue' import App from './Ap ...