poj3694 邊 雙連通分量 lca

2022-03-15 23:58:21 字數 1596 閱讀 7614

題意:先給了一張無向圖,然後依次加邊,每次求橋的數量

題解:先用一次tarjan,我們可以標記橋的位置和記錄橋的數量同時記錄fa陣列,然後更新邊的時候我們可以用lca,因為在tarjan縮點之後得到了一顆樹,當連線a,b節點時,可以直觀的看出從a,b的最近公共祖先到a,b之間所有的橋都會消失,我們可以不斷更新橋的標記來輸出答案,同時之前連的邊對後面的(除了橋數以外)結果沒有影響

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define fi first

#define se second

#define mp make_pair

#define pb push_back

#define pii pair#define c 0.5772156649

#define pi acos(-1.0)

#define ll long long

#define mod 1000000007

#define ls l,m,rt<<1

#define rs m+1,r,rt<<1|1

using

namespace

std;

using

namespace

__gnu_cxx;

const

double g=10.0,eps=1e-7

;const

int n=100000+10,maxn=100000+10,inf=0x3f3f3f

;struct

edgee[n*6

];int

head[n],cnt,fa[n];

intdfn[n],low[n];

intindex,num,iscut[n];

void add(int u,int

v)void init(int

n) memset(head,-1,sizeof

head);

index=num=cnt=0;}

void tarjan(int u,int

f)

if(!dfn[x])

else low[u]=min(low[u],dfn[x]);

}}void lca(int a,int

b)

while(a!=b)

}int

main()

fa[1]=1

; tarjan(

1,-1

); printf(

"case %d:\n

",res++);

intq;

scanf("%d

",&q);

while(q--)

puts(

"");

}return0;

}/************

***********

*/

view code

poj 3352 邊雙連通分量

思路 可以求出所有的橋,把橋刪掉。然後把所有的連通分支求出來,顯然這些連通分支就是原圖中的雙連通分支。把它們縮成點,然後添上剛才刪去的橋,就構成了一棵樹。在樹上添邊使得樹變成乙個雙連通分支即可,這裡我們可以直接統計縮點後的葉子節點個數即可,從而要加的邊數即為 葉子節點個數 1 2.1 include...

POJ 3352 邊雙連通分量

題目鏈結 題目大意 乙個連通圖中,至少新增多少條邊,使得刪除任意一條邊之後,圖還是連通的。解題思路 首先來看下邊雙連通分量的定義 如果任意兩點至少存在兩條 邊不重複 的路徑,那麼說這個圖是邊雙連通的。那麼本題中,刪除任意一條邊,就可以看作是毀掉一條路徑,那麼只要至少還存在一條路徑即可。也就是說,轉化...

邊雙連通分量還有橋

我發現了兩種邊雙的寫法 1.先求橋,標記橋再dfs求連通塊,似乎有點麻煩 2.直接上有向圖的寫法,把回頭的情況標記一下 其1int tarjan int x,int fa else if fa 1 i fa 1 return 0 int dfss int x return 0 scanf d lld...