POJ 3694 Network ——(桥 + LCA)
题意:给n个点和m条边,再给出q条边,问每次加一条边以后剩下多少桥。
分析:这题是结合了LCA和dfn的妙用。_dfn数组和dfn的意义不一样,并非访问的时间戳,_dfn表示的是被访问的顺序,而且是多线程访问下的顺序,举个例子,同一个点分岔开来的点,距离这个点相同距离的点,他们的_dfn的值是相同的,而dfn不是,类似于单线程dfs访问的各点的dfn值是不同的。
具体见代码:
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <map>
#include <vector>
#include <queue>
using namespace std;
const int N = + ; int n,m,tot,head[N],cnt,dfs_clock,dfn[N],_dfn[N],root[N],low[N];
bool bridge[N];
struct edge
{
int nxt,v;
}edges[N<<]; void init()
{
tot = ,dfs_clock = ,cnt = ;
memset(head,-,sizeof(head));
memset(dfn,,sizeof(dfn));
memset(_dfn,,sizeof(_dfn));
memset(bridge,false,sizeof(bridge));
for(int i=;i<=n;i++) root[i] = i;
} void addEdge(int u,int v)
{
edges[tot] = (edge){head[u],v};
head[u] = tot ++;
edges[tot] = (edge){head[v],u};
head[v] = tot ++;
} void tarjan(int u)
{
dfn[u] = low[u] = ++dfs_clock;
_dfn[u] = _dfn[root[u]] + ;
for(int i=head[u];i!=-;i=edges[i].nxt)
{
edge &e = edges[i];
int v = e.v;
if(!dfn[v])
{
root[v] = u;
tarjan(v);
low[u] = min(low[u],low[v]);
if(low[v] > dfn[u])
{
cnt ++;
bridge[v] = true;
}
}
else if(dfn[v] < dfn[u] && v!=root[u]) low[u] = min(low[u],dfn[v]);
}
} void LCA(int u,int v)
{
while(_dfn[u] > _dfn[v])
{
if(bridge[u])
{
cnt --;
bridge[u] = false;
}
u = root[u];
}
while(_dfn[u] < _dfn[v])
{
if(bridge[v])
{
cnt --;
bridge[v] = false;
}
v = root[v];
}
while(u != v)
{
if(bridge[u])
{
cnt --;
bridge[u] = false;
}
if(bridge[v])
{
cnt --;
bridge[v] = false;
}
u = root[u];
v = root[v];
}
} void solve()
{
for(int i=;i<=n;i++) if(!dfn[i]) tarjan(i); int q;scanf("%d",&q);
while(q--)
{
int u,v;scanf("%d%d",&u,&v);
LCA(u,v);
printf("%d\n",cnt);
}
puts("");
} int main()
{
int kase = ;
while(scanf("%d%d",&n,&m)==)
{
if(n== && m==) break;
init();
printf("Case %d:\n",kase++);
while(m--)
{
int u,v;scanf("%d%d",&u,&v);
addEdge(u,v);
}
solve();
}
}
POJ 3694 Network ——(桥 + LCA)的更多相关文章
- POJ 3694 Network (tarjan + LCA)
题目链接:http://poj.org/problem?id=3694 题意是给你一个无向图n个点,m条边,将m条边连接起来之后形成一个图,有Q个询问,问将u和v连接起来后图中还有多少个桥. 首先用t ...
- poj 3694 Network(割边+lca)
题目链接:http://poj.org/problem?id=3694 题意:一个无向图中本来有若干条桥,有Q个操作,每次加一条边(u,v),每次操作后输出桥的数目. 分析:通常的做法是:先求出该无向 ...
- POJ 3694 tarjan 桥+lca
Network Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7298 Accepted: 2651 Descripti ...
- Poj 3694 Network (连通图缩点+LCA+并查集)
题目链接: Poj 3694 Network 题目描述: 给出一个无向连通图,加入一系列边指定的后,问还剩下多少个桥? 解题思路: 先求出图的双连通分支,然后缩点重新建图,加入一个指定的边后,求出这条 ...
- poj 3417 Network(tarjan lca)
poj 3417 Network(tarjan lca) 先给出一棵无根树,然后下面再给出m条边,把这m条边连上,然后每次你能毁掉两条边,规定一条是树边,一条是新边,问有多少种方案能使树断裂. 我们设 ...
- POJ 3694——Network——————【连通图,LCA求桥】
Network Time Limit:5000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Stat ...
- POJ 3694 Network (求桥,边双连通分支缩点,lca)
Network Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5619 Accepted: 1939 Descripti ...
- POJ 3694 Network(无向图求桥+重边处理+LCA)
题目大意: 给你一个无向图,然后再给你一个Q代表有Q次询问,每一次加一条边之后还有几座桥.在这里要对重边进行处理. 每次加入一条边之后,在这条搜索树上两个点的公共祖先都上所有点的桥都没了. 这里重边的 ...
- POJ 3694 Network(并查集缩点 + 朴素的LCA + 无向图求桥)题解
题意:给你一个无向图,有q次操作,每次连接两个点,问你每次操作后有几个桥 思路:我们先用tarjan求出所有的桥,同时我们可以用并查集缩点,fa表示缩点后的编号,还要记录每个节点父节点pre.我们知道 ...
随机推荐
- tomcat 虚拟目录 连接池
- C#文本_文件夹操作
1我们常用的File类 可以用来对文件的一些操作 下面看代码. using System;using System.Collections.Generic;using System.IO;using ...
- 【原创】大叔经验分享(57)hue启动coordinator时报错
hue启动coordinator时报错,页面返回undefinied错误框: 后台日志报错: runcpserver.log [13/May/2019 04:34:55 -0700] middlewa ...
- Android中如何判断内存卡是否存在
if (Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) { /* 得到SD卡得路 ...
- java实现spark常用算子之Reduce
import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.a ...
- StringUtils类API及使用方法详解
StringUtils类API及使用方法详解 StringUtils方法概览 判空函数 1)StringUtils.isEmpty(String str) 2)StringUtils.isNotEmp ...
- java开发环境构建
一. 基本工具安装 1. 配置终端命令别名 vim ~/.bash_profile *********************************************** # for colo ...
- Migrating authentication of Samba from smbpasswd to tdb
Was addicted various After you upgrade the OS of old Samba server. Put it also was using a set of 2. ...
- kubernetes之NFS动态提供Kubernetes后端存储卷
StorageClass作为对存储资源的抽象定义, 对用户设置的NFS申请屏蔽后端存储的细节, 一方面减少了用户对于存储资源细节的关注, 另一方面减轻了管理员手工管理pv的工作, 由系统自动完成pv的 ...
- three.js之元素周期表
<html><head> <title>three.js css3d - periodic table</title> <meta charset ...