poj 3694 无向图求桥+lca
题意抽象为:
给一个无向图和一些询问
对于每一次询问:
每次询问都会在图上增加一条边
对于每一次询问输出此时图上桥的个数。
桥的定义:删除该边后原图变为多个连通块。
数据规模:点数N(1 ≤ N ≤ 100,000) ,边数M(N - 1 ≤ M ≤ 200,000),询问数Q ( 1 ≤ Q ≤ 1,000)
先跑一遍tarjan,对边双连通分枝缩一下点。
再维护lca即可。
AC代码:
#include<cstdio>
#include<cstring>
#include<queue>
#define rep(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
const int MAXV=;
const int MAXE=;
int DFN[MAXV],low[MAXV],par[MAXV],label[MAXV];
int pointer[MAXV];
int tot,cnt,m,n,Bcnt,ans;
vector<int> graph[MAXV];
struct Edge
{
int to,next;
bool vis;
Edge() {}
Edge(int b,int nxt,int flag) {to=b,next=nxt,vis=flag;}
}edge[MAXE];
inline void addedge(int a,int b)
{
edge[tot]=Edge(b,pointer[a],);
pointer[a]=tot++;
edge[tot]=Edge(a,pointer[b],);
pointer[b]=tot++;
}
void init()
{
tot=;
cnt=;Bcnt=;
memset(pointer,-,sizeof(pointer));
memset(label,,sizeof(label));
memset(DFN,,sizeof(DFN));
}
void tarjan(int u,int pre)
{
DFN[u]=low[u]=++cnt;
for(int j=pointer[u];j!=-;j=edge[j].next)
{
int v=edge[j].to;
if(edge[j].vis) continue;
edge[j].vis=edge[j^].vis=;
if(!DFN[v])
{
par[v]=j;
tarjan(v,u);
if(low[v]<low[u]) low[u]=low[v];
}
else if(low[u]>DFN[v]) low[u]=DFN[v];
}
}
void part(int u)
{
label[u]=Bcnt;
for(int j=pointer[u];j!=-;j=edge[j].next)
{
int v=edge[j].to;
if(!label[v]&&edge[j].vis) part(v);
}
}
int dep[MAXV];
int father[MAXV],a[MAXV];
void lca_bfs(int S)
{
rep(i,,Bcnt) dep[i]=-;
queue<int>q;
dep[S]=;
q.push(S);
father[S]=S;
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=;i<graph[u].size();++i)
{
int v=graph[u][i];
if(dep[v]==-)
{
dep[v]=dep[u]+;
a[v]=;
father[v]=u;
q.push(v);
}
}
}
}
void lca(int u,int v)
{
if(dep[u]>dep[v]) swap(u,v);
while(dep[u]<dep[v])
{
if(a[v])
{
ans--;
a[v]=;
}
v=father[v];
}
while(u!=v)
{
if(a[v])
{
ans--;
a[v]=;
}
v=father[v];
if(a[u])
{
ans--;
a[u]=;
}
u=father[u];
}
}
int main()
{
// freopen("in.txt","r",stdin);
int icase=;
while(scanf("%d%d",&n,&m)&&m&&n)
{
int a,b;
init();
rep(i,,m)
{
scanf("%d%d",&a,&b);
addedge(a,b);
}
tarjan(,);
int tmp,u;
rep(i,,n)
{
tmp=par[i]^;
u=edge[tmp].to;
if(DFN[u]<low[i])
{
edge[tmp].vis=edge[tmp^].vis=;
}
}
rep(i,,n)
{
if(!label[i])
{
Bcnt++;
part(i);
}
}
ans=Bcnt-;
rep(i,,n)
{
if(!edge[par[i]].vis)
{
tmp=par[i]^;
u=edge[tmp].to;
graph[label[u]].push_back(label[i]);
graph[label[i]].push_back(label[u]);
}
}
lca_bfs();
int v,q;
scanf("%d",&q);
printf("Case %d:\n",++icase);
rep(i,,q)
{
scanf("%d%d",&u,&v);
lca(label[u],label[v]);
printf("%d\n",ans);
}
printf("\n"); }
return ;
}
poj 3694 无向图求桥+lca的更多相关文章
- Network POJ - 3694 无向图找桥
题意: 给你一个无向图,你需要找出来其中有几个桥 桥: 1.存在重边必定不为桥 2.low[v]>dfn[u] 代码: //题意很清晰 //就是这个需要先找出来原无向图中的桥个数,然后在判断添加 ...
- POJ 3694 无向图的桥
Network Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10404 Accepted: 3873 Descript ...
- POJ 3694 Network ——(桥 + LCA)
题意:给n个点和m条边,再给出q条边,问每次加一条边以后剩下多少桥. 分析:这题是结合了LCA和dfn的妙用._dfn数组和dfn的意义不一样,并非访问的时间戳,_dfn表示的是被访问的顺序,而且是多 ...
- UVA 796 Critical Links(无向图求桥)
题目大意:给你一个网络要求这里面的桥. 输入数据: n 个点 点的编号 (与这个点相连的点的个数m) 依次是m个点的 输入到文件结束. 桥输出的时候需要排序 知识汇总: 桥: 无向连通 ...
- 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D
目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...
- UVA 796 Critical Links(模板题)(无向图求桥)
<题目链接> 题目大意: 无向连通图求桥,并将桥按顺序输出. 解题分析: 无向图求桥的模板题,下面用了kuangbin的模板. #include <cstdio> #inclu ...
- HDU 4738--Caocao's Bridges(重边无向图求桥)
Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- POJ 3694 (tarjan缩点+LCA+并查集)
好久没写过这么长的代码了,题解东哥讲了那么多,并查集优化还是很厉害的,赶快做做前几天碰到的相似的题. #include <iostream> #include <algorithm& ...
- uva 796 Critical Links(无向图求桥)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
随机推荐
- centos7救援模式--rescue模式
前序 经典问题:系统无法进入,如grub损坏或某个配置文件改错 操作 1 按方向键到Boot,选到Hard Driver,按减号,使其下移,最终让CD-ROM Drive到第一行,并按F10保存 2 ...
- 使用python玩跳一跳亲测使用步骤详解
玩微信跳一跳,测测python跳一跳,顺便蹭一蹭热度: 参考博文 使用python玩跳一跳超详细使用教程 WIN10系统,安卓用户请直入此: python辅助作者github账号为:wangshub. ...
- URL和URI简单辨析
URI 全称为 Universal Resource Identifier,统一资源标识符,用来唯一的标识一个资源. URL 全称为Universal Resource Locator,统一资源定位器 ...
- Linux中通过Socket文件描述符寻找连接状态介绍
针对下文的总结:socket是一种文件描述符 进程的打开文件描述符表 Linux的三个系统调用:open,socket,pipe 返回的都是一个描述符.不同的进程中,他们返回的描述符可以相同.那么,在 ...
- Android View 阴影的总结
关于 Android 阴影,大家肯定不陌生的.但是Android 中到底有多少种方式可以实现阴影效果以及各种方式之间有什么区别和优缺点,这就是我想总结的.下面我们一个一个来说: 一.各种实现阴影的方式 ...
- box-sizing 和 dom width
refer : https://developer.mozilla.org/en-US/docs/Web/API/CSS_Object_Model/Determining_the_dimensions ...
- 机器学习 之KNN近邻法
目录 1.KNN近邻法 1.KNN近邻法 KNN模型由三个基本要素决定: 距离度量:其中欧式距离一般误差最小,\(x_{i} 和 x_{j}\)为两个样本点:\[L_{2}(x_{i}, x_{j}) ...
- SAP WDA 自建Portal
1.新建Package:ZWDA. 2.新建Portal用户表:ZPORTAL_USER 上图中是基于CRM的BP来做的用户表,如果针对其他系统可以使用组织架构里的角色用户... 3.新建用户视图配置 ...
- OAF 抛出html消息
throw new oracle.apps.fnd.framework.OAException("<html><p style=\"color:#FF0000; ...
- 牛客网练习赛23 F 托米的游戏
链接:https://www.nowcoder.com/acm/contest/156/F 来源:牛客网 题目描述 题目背景编不下去了 托米有一棵有根树 T, 树根为1,每轮他会在剩下的子树中等概率一 ...