POJ 3694 Network 邊雙連通分量+LCA
title
analysis
求雙連通分量,利用並查集縮點,形成一棵樹,樹邊肯定都是橋,然後每對點x,y,找原圖中x,y點對應的新圖中的點,如果不是一個點,則向上找它們的LCA,因為它們之間連了一條邊,所以這些點到它們的LCA之間的邊都不是割邊了,找LCA時,先將兩點上升到同一層次,然後一起再向上找父親節點,其間遇到橋就把橋的標記刪除,並且答案減1。
code
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
template<typename T>inline void read(T &x)
{
x=0;
T f=1,ch=getchar();
while (!isdigit(ch) && ch^'-') ch=getchar();
if (ch=='-') f=-1, ch=getchar();
while (isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48), ch=getchar();
x*=f;
}
int ver[maxn<<1],Next[maxn<<1],head[maxn],len;
inline void add(int x,int y)
{
ver[++len]=y,Next[len]=head[x],head[x]=len;
}
int dfn[maxn],low[maxn],id;
int fa[maxn],d[maxn],num;
bool bridge[maxn<<1];
inline void tarjan(int x)
{
dfn[x]=low[x]=++id;
d[x]=d[fa[x]]+1;
for (int i=head[x];i;i=Next[i])
{
int y=ver[i];
if (!dfn[y])
{
fa[y]=x;
tarjan(y);
low[x]=min(low[x],low[y]);
if (low[y]>dfn[x])
++num,bridge[y]=1;
}
else if (y!=fa[x])
low[x]=min(low[x],dfn[y]);
}
}
inline void lca(int x,int y)
{
while (d[x]>d[y])
{
if (bridge[x])
--num,bridge[x]=0;
x=fa[x];
}
while (d[y]>d[x])
{
if (bridge[y])
--num,bridge[y]=0;
y=fa[y];
}
while (x!=y)
{
if (bridge[x]) --num,bridge[x]=0;
if (bridge[y]) --num,bridge[y]=0;
x=fa[x];
y=fa[y];
}
}
int n,m,flag;
inline void Clear()
{
memset(d,0,sizeof(d));
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(bridge,0,sizeof(bridge));
memset(head,0,sizeof(head));
len=id=num=0;
for (int i=1;i<=n;++i)
fa[i]=i;
}
int main()
{
while (1)
{
read(n);read(m);
if (!n && !m) break;
Clear();
printf("Case %d:\n",++flag);
for (int i=1;i<=m;++i)
{
int x,y;
read(x);read(y);
add(x,y);add(y,x);
}
tarjan(1);
int q;read(q);
for (int i=1;i<=q;++i)
{
int x,y;
read(x);read(y);
lca(x,y);
printf("%d\n",num);
}
puts("");
}
return 0;
}
相關文章
- POJ 1236 Network of Schools 強連通分量
- 無向連通圖邊雙連通分量
- 無向連通圖點雙連通分量
- Day8 雙連通分量
- Network(POJ-1144)
- POJ 1861 Network (Kruskal)
- POJ1330 Nearest Common Ancestors【LCA】REST
- Network of Schools(POJ-1236)
- Day7 割點、割邊和強連通分量
- 【筆記/模板】無向圖的雙連通分量筆記
- The Bottom of a Graph-POJ2553強連通
- 「學習筆記」雙連通分量、割點與橋筆記
- 強連通分量
- 邊分治維護強連通分量(CF1989F,P5163)
- 【演算法學習】tarjan 強連通、點雙、邊雙及其縮點 重磅來襲!!!!演算法
- UVA1327 && POJ1904 King's Quest(tarjan+巧妙建圖+強連通分量+縮點)
- POJ 1330 LCA最近公共祖先 離線tarjan演算法演算法
- POJ - 2236 Wireless Network (kuangbin - 簡單搜尋)
- Tarjan求強連通分量
- 強連通分量(Tarjan演算法)演算法
- 【模板】tarjan 強連通分量縮點
- 有向圖的強連通分量 模版
- Tarjan演算法(強連通分量分解)演算法
- 圖論——強連通分量(Tarjan演算法)圖論演算法
- Tarjan 求有向圖的強連通分量
- lca
- Chrome Network 下邊欄中 Finish 的含義Chrome
- 【Tarjan SCC 加邊使得所有圖聯通 至少選取多少個點能圖聯通 】Network of Schools加強版.md
- kosaraju 和 tarjan演算法詳解(強連通分量)演算法
- UVA-11504 - Dominos(有向圖的強連通分量)
- 2024-05-05 通達信選股 雙黃連
- 019 通過連結串列學Rust之雙連結串列實現PeekRust
- 求 LCA
- POJ1915,雙向寬度優先搜尋
- 直流分量2
- 016 通過連結串列學習Rust之安全的雙連結串列佈局Rust
- 強連通分量及縮點 演算法解析及例題演算法
- RMQ求lcaMQ