題意:先給了一張無向圖,然後依次加邊,每次求橋的數量
題解:先用一次tarjan,我們可以標記橋的位置和記錄橋的數量同時記錄fa陣列,然後更新邊的時候我們可以用lca,因為在tarjan縮點之後得到了一顆樹,當連線a,b節點時,可以直觀的看出從a,b的最近公共祖先到a,b之間所有的橋都會消失,我們可以不斷更新橋的標記來輸出答案,同時之前連的邊對後面的(除了橋數以外)結果沒有影響
#include#includeview code#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;
}/************
***********
*/
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...