Network POJ - 3694 (LCA+tarjan+桥)
题目链接:https://vjudge.net/problem/POJ-3694
具体思路:首先可以通过缩点的方式将整个图变成一个树,并且树的每条边是桥,但是我们可以利用dfn数组将整个图变成树,这样就可以省去缩点的过程了,同时lca的作用。假设有如下情况。
f->a f->b,这是缩点之后的,如果在a,b之间加一条边的话,从a->a和b的最近公共祖先节点-> b 之间的桥都会去除,这个时候就需要用到lca了/
AC代码(折磨了我两天--):
#include<iostream>
#include<stack>
#include<queue>
#include<map>
#include<stdio.h>
#include<cstring>
#include<string>
#include<iomanip>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
# define ll long long
# define maxn +
# define inf 0x3f3f3f3f
int head[maxn],dfn[maxn],low[maxn];
int judge[maxn];
int father[maxn];
int edge,num,n,m,ans;
struct node
{
int to;
int nex;
} q[maxn];
void init()
{
memset(judge,,sizeof(judge));
memset(head,-,sizeof(head));
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
for(int i=; i<=n; i++)
{
father[i]=i;
}
edge=;
num=;
ans=;
}
void addedge(int fr,int to)
{
q[edge].to=to;
q[edge].nex=head[fr];
head[fr]=edge++;
}
void tarjan(int u,int root)
{
low[u]=dfn[u]=++num;
dfn[u]=dfn[root]+;//建造树的过程。
for(int i=head[u]; i!=-; i=q[i].nex)
{
int temp=q[i].to;
if(temp==root)continue;//如果 1-> 2 这条边已经访问过的话,2->1 就没有必要访问了,如果在访问的话会出问题的。
if(dfn[temp]==)
{
father[temp]=u;
tarjan(temp,u);
low[u]=min(low[u],low[temp]);
if(low[temp]>dfn[u])//判断桥的方法,注意比较的是前一个的时间戳
{
ans++;
judge[temp]=;
}
}
else if(temp!=u)
{
low[u]=min(low[u],dfn[temp]);
}
}
}
void lca(int t1,int t2)
{ while(dfn[t1]<dfn[t2])
{
if(judge[t2])ans--,judge[t2]=;
t2=father[t2];
}
while(dfn[t1]>dfn[t2])
{
if(judge[t1])
{
ans--;
judge[t1]=;
}
t1=father[t1];
}
while(t1!=t2)
{
if(judge[t1])ans--;
if(judge[t2])ans--;
judge[t1]=;
judge[t2]=;
t1=father[t1];
t2=father[t2];
}
}
int main()
{
int Case=;
while(~scanf("%d %d",&n,&m)&&(n+m))
{
init();
int t1,t2;
for(int i=; i<=m; i++)
{
scanf("%d %d",&t1,&t2);
addedge(t1,t2);
addedge(t2,t1);
}
tarjan(,);
int t;
printf("Case %d:\n",++Case);
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&t1,&t2);
lca(t1,t2);
printf("%d\n",ans);
}
printf("\n");
}
return ;
}
Network POJ - 3694 (LCA+tarjan+桥)的更多相关文章
- Network POJ - 3694 无向图找桥
题意: 给你一个无向图,你需要找出来其中有几个桥 桥: 1.存在重边必定不为桥 2.low[v]>dfn[u] 代码: //题意很清晰 //就是这个需要先找出来原无向图中的桥个数,然后在判断添加 ...
- Network POJ - 3694(lca并查集+连通图求桥)
就是求出原先图中的桥的数量,在每一次询问时加入一条新边,求加入当前边后图中剩余的桥的数量 求出原先图中的桥的数量,然后减去新加入边的两端点之间的桥的数量,就是剩余桥的数量.. 用并查集把属于同一集合的 ...
- poj 3694 无向图求桥+lca
题意抽象为: 给一个无向图和一些询问 对于每一次询问: 每次询问都会在图上增加一条边 对于每一次询问输出此时图上桥的个数. 桥的定义:删除该边后原图变为多个连通块. 数据规模:点数N(1 ≤ N ≤ ...
- Network POJ - 3694 (连通图标求桥)
有上述两个数组定义可知:对于某点root,其有一儿子v,则有: 1. 如果dfn[root]<=low[v]此点是割点(对于dfs树的根,即最初节点需要两个儿子才是割点) 2. ...
- D - Network - poj3694(LCA求桥)
题意:有一个网络有一些边相互连接,现在有Q次操作,求每次操作后的桥的个数 分析:开始竟然不知道还有LCA这么个东西....... *********************************** ...
- POJ 3694 LCA
题意:有N台电脑,他们之间有M条无向边. 然后询问,每次在他们之间加一条边,剩余的桥有多少. 思路:其实这题都不需要缩点了.. 直接记录每条桥的位置,然后每次询问进行一次LCA,当询问到桥时,桥数减1 ...
- [kuangbin带你飞]专题九 连通图D - Network POJ - 3694
这道题其实也非常简单,只是在求割边及其个数的情况下,每次往里面加入新的边,并再次计算割边的个数. 我们用tarjan可以求出原图的桥以及个数,当然我们不能暴力加边,然后求解,那么如何求呢??? 其实非 ...
- POJ 3694 无向图的桥
Network Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10404 Accepted: 3873 Descript ...
- 【POJ 3694】 Network(割边<桥>+LCA)
[POJ 3694] Network(割边+LCA) Network Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7971 ...
随机推荐
- JS在当前页面插入<script>标签,并执行
将<script>标签绑定到<html>上, html可换成body,header等其他存在的标签. var htmm =document.getElementsByTagNa ...
- Qt中父子widget的事件传递
以前我一直以为:在父widget上摆一个子widget后,当click子widget时:只会进入到子widget的相关事件处理函数中,比如进入到mousePressEvent()中, 而不会进入到父w ...
- java map的 keyset()方法
- Android Espresso(UI自动化测试)的搭建
Espresso是Google官方提供的Android UI自动化测试的框架. 为什么叫Espresso(浓咖啡),好像是想让Android码农们轻松的写完自动化用例后能享受着咖啡,看着自动化测试&q ...
- sql语句左链接left join--3张表关联
表A---------------------------------关联第一张表B-----------------------关联第二张表c select * fomr 表名A left join ...
- [AT2364] [agc012_d] Colorful Balls
题目链接 AtCoder:https://agc012.contest.atcoder.jp/tasks/agc012_d 洛谷:https://www.luogu.org/problemnew/sh ...
- 利用script和scriptlet moniker绕过脚本白名单限制
没事儿看了一下subtee和enigma0x3今年在BSides Nashville 2017上的演讲,觉得这两个猥琐男简直不能再猥琐了 :-)其中有一个猥琐小技巧,又可以让我们好好hunting一番 ...
- 【bzoj2115】【wc2011】Xor
2115: [Wc2011] Xor Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 5380 Solved: 2249[Submit][Status ...
- 洛谷P1991 无线通讯网
P1991 无线通讯网 170通过 539提交 题目提供者洛谷OnlineJudge 标签图论 难度普及+/提高 提交该题 讨论 题解 记录 最新讨论 怎么又炸了 为啥一直40!求解! UKE:inv ...
- select网络模型知识总结
select模型支持IO多路复用,select函数如下 int select ( IN int nfds, //windows下无意义,linux有意义 IN OUT fd_set* readfds, ...