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.我们知道 ...
随机推荐
- Windows10出现打开EXE应用程序错误
运行部分EXE文件,弹出错误“该文件没有与之关联的程序来执行该操作 右键开始菜单, PowerShell(管理员) 也是一样 连安装程序Vs2017都无法启动,用了多种方法都不能搞定. 花了不少时间 ...
- Leaflet个人封装笔记
<!DOCTYPE html> <html> <head> <link href="style/leaflet.css" type=&qu ...
- vue-router History 本地开发环境和nginx配置
vue-router mode=history本地开发环境配置 解决方法1.修改webpack的的devServer配置项(devServe存在于,rvue-cli2在webapck.config.j ...
- js之语句(条件语句,循环语句,跳转语句)
一.条件语句 1.if语句 条件语句是通过判断指定表达式的值来决定执行还是跳过某些语句,这些语句是代码是“决策点”有时称之为“分支”. if语句是一种基本的控制语句,它让Javascript程序可以选 ...
- ES6 class 继承 与面向对象封装开发简单实例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- vue学习(2)-过滤器
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 简单聊聊服务发现(redis, zk,etcd, consul)(转载)
服务发现并没有怎样的高深莫测,它的原理再简单不过.只是市面上太多文章将服务发现的难度妖魔化,读者被绕的云里雾里,顿觉自己智商低下不敢高攀. 服务提供者是什么,简单点说就是一个HTTP服务器,提供了AP ...
- Oracle笔记(三) Scott用户的表结构
在Oracle的学习之中,重点使用的是SQL语句,而所有的SQL语句都要在scott用户下完成,这个用户下一共有四张表,可以使用: SELECT * FROM tab; 查看所有的数据表的名称,如果现 ...
- 【2017-05-04】winfrom进程、线程、用户控件
一.进程 一个进程就是一个程序,利用进程可以在一个程序中打开另一个程序. 1.开启某个进程Process.Start("文件缩写名"); 注意:Process要解析命名空间. 2. ...
- Hadoop_05_运行 Hadoop 自带 MapReduce程序
1. MapReduce使用 MapReduce是Hadoop中的分布式运算编程框架,只要按照其编程规范,只需要编写少量的业务逻辑代码即可实现 一个强大的海量数据并发处理程序 2. 运行Hadoop自 ...