HDU4738 邊雙連通分量

2021-07-31 17:11:48 字數 1596 閱讀 9361

<-

no response.

注意連通麼?

重邊怎麼處理啊?

answer=0,聽說還需要人。

the solution.

1th.處理連通的話,推薦bfs!如果涉及圖遍歷問題!bfs!你以為dfs標記掉複雜度就低了麼?

2nd.重邊處理的話,從u->v避免v->u.

在利用鏈式前向星儲存圖,利用異或,like: 0^1=1,1^1=1,2^1=3,3^1=2…n(

n%2==

0)^ 1=

n+1 , (n

+1) ^ 1=

n .

每次對於編號為 i 的邊,如果

i ^ 1=

pre,pre即為父節點的那條邊 ,則不處理這條邊。那如果判斷前驅結點 == v是錯的。為啥呢?

因為那樣處理是單單處理了 「一條無向邊」,兩個結點的「多條邊」的地位是等價的,如果記錄前驅結點,判斷掉,只會處理兩個結點的「多條邊」其中的「一條邊」。在這裡,要求邊的最小權值,然後如果用記錄前驅結點,判斷掉,這樣dfs只遍歷到了兩個結點間的一條邊。

3rd.咳咳.

這樣寫題解好累啊……算了,自娛自樂吧。

//#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

typedef

long

long ll;

using

namespace

std;

//#pragma comment(linker, "/stack:102400000,102400000")

const

int inf=0x3f3f3f3f;

const

int n=1e3+10;

struct edgeedge[n*n];

int tol,head[n],n,m;

void init()

void add(int u,int v,int w)

bool vis[n],flag[n];

int low[n],dfn[n];

int ind;

int max;

void tarjan(int u,int pre)

else

low[u]=min(low[u],dfn[v]);

}// if(pre==u && son>1)

// flag[u]=true;

}void solve()

}int num;

queue

que;

int bfs()

}return res;

}int main()

/************/

if(bfs()puts("0");

continue;

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

solve();

}return

0;}

HDU 4738 雙聯通分量

點選開啟鏈結 題意 給出乙個無向圖和每條邊的權值,現在破壞一條路使得圖不再聯通,只能破壞一條路,問最少需要的花費,花費為邊上的權值,注意的是,圖剛開始可能不連通,輸出1 花費最小的邊為0輸出1,其他沒什麼了 思路 求橋的模版題,在找到乙個橋時更新費用最小,對了還有乙個可能有重邊,簡單 include...

hdu 2242 邊雙連通分量)

思路 tarjan求邊雙連通分量,進行縮點後成樹,然後就是樹型dp,求一下最小差值就行了。ps 注意點 由於雙向建邊,dp搜尋時要記錄父親,只能往下搜,不能搜該節點的父親。1 include2 include3 include4 include5 include6 include7 using na...

邊雙連通分量還有橋

我發現了兩種邊雙的寫法 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...