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 ...
随机推荐
- Java多线程编程(学习笔记)
一.说明 周末抽空重新学习了下多线程,为了方便以后查阅,写下学习笔记. 有效利用多线程的关键是理解程序是并发执行而不是串行执行的.例如:程序中有两个子系统需要并发执行,这时候需要利用多线程编程. 通过 ...
- 【poj2409】Let it Bead Polya定理
题目描述 用 $c$ 种颜色去染 $r$ 个点的环,如果两个环在旋转或翻转后是相同的,则称这两个环是同构的.求不同构的环的个数. $r·c\le 32$ . 题解 Polya定理 Burnside引理 ...
- MySQL主键和外键使用及说明
摘自网上一个经典的例子:大哥和小弟 一.外键约束 MySQL通过外键约束来保证表与表之间的数据的完整性和准确性. 外键的使用条件: 1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说 ...
- Oracle 高性能SQL引擎剖析----执行计划
执行计划是指示Oracle如何获取和过滤数据.产生最终结果集,是影响SQL语句执行性能的关键因素.我们在深入了解执行计划之前,首先需要知道执行计划是在什么时候产生的,以及如何让SQL引擎为语句生成执行 ...
- 【BZOJ1565】【NOI2009】植物大战僵尸(网络流)
[BZOJ1565][NOI2009]植物大战僵尸(网络流) 题面 BZOJ 洛谷 题解 做了这么多神仙题,终于有一道能够凭借自己智商能够想出来的题目了.... 好感动. 这就是一个比较裸的最小割模型 ...
- 2017-2018-2 20165218 实验三《敏捷开发与XP实践》实验报告
实验三 敏捷开发与XP实践 课程:java程序设计 姓名:赵冰雨 学号:20165218 指导教师:娄嘉鹏 实验日期:2018.4.30 实验内容.步骤与体会: (一)编码标准 //实验要求 //参考 ...
- eclipse show view失效的解决办法
今天打开eclipse,发现console窗口没有了,然后使用show view也无法打开,上网查找办法,找到了方法试了一下,窗口重置(Windows-->Perspective-->Re ...
- 题解【bzoj3240 [NOI2013]矩阵游戏】
挖坑2333 等我把代码写完了再写
- HDU 4352 数位dp
XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- phpmyadmin 登录时间修改
登录后1440秒未活动后总是自动退出,一天还要登录多次,终于有时间来解决这个问题了,感觉是session超时,结果在网上search了下,找到解决办法啦,哈哈哈,在此做个笔记:phpmyadmin在使 ...