HDU 4005 The war 雙連通好題)

2021-09-08 13:12:26 字數 1365 閱讀 2801

題目鏈結

題意:給乙個連通的無向圖。每條邊有乙個炸掉的代價。如今要建一條邊(你不不知道的),然後你要求乙個你須要的最少代價,保證無論他建在哪,你都能炸掉使得圖不連通

思路:炸肯定要炸橋,所以先雙連通縮點,得到一棵樹,樹邊是要炸的,那麼找乙個最小值的邊。從該邊的兩點出發。走的路徑中,把兩條包括最小值的路徑。的兩點連邊。形成乙個環。這個環就保證了最低代價在裡面。除了這個環以外的最小邊。就是答案,這種話,就利用乙個dfs,搜到每乙個子樹的時候進行乙個維護就可以

**:

#include #include #include #include using namespace std;

const int n = 10005;

const int m = 200005;

int n, m;

struct edge

edge(int u, int v, int val, int id)

} edge[m];

int en, first[n], next[m];

void init()

void add_edge(int u, int v, int val, int id)

int pre[n], dfn[n], dfs_clock, bccn, bccno[n];

vectorbcc[n];

void dfs_cut(int u, int id) else dfn[u] = min(dfn[u], pre[v]); }}

void find_cut()

void dfs_bcc(int u)

}const int inf = 0x3f3f3f3f;

edge mine;

void find_bcc()

} for (int i = 1; i <= bccn; i++) bcc[i].clear();

mine.val = inf;

for (int i = 0; i < en; i++)

}int ans;

int dfs(int u, int f)

ans = min(ans, min2);

return min1;

}int main()

find_cut();

find_bcc();

if (bccn == 1)

ans = inf;

u = bccno[mine.u]; v = bccno[mine.v];

dfs(u, v);

dfs(v, u);

if (ans == inf) ans = -1;

printf("%d\n", ans);

} return 0;

}

hdu 4005 邊雙聯通 LCA

題意 有一幅圖,現在要加一條邊,加邊之後要你刪除一條邊,使圖不連通,費用為邊的費用,要你求的是刪除的邊的最小值的最大值 每次都可以刪除一條邊,選最小的刪除,這些最小中的最大就為答案 首先要進行縮點,把圖縮為一棵樹,因此,加入一條邊後圖就會存在乙個環,環中的任何一條邊刪除後都不會導致圖不連通 之後找一...

HDU 5409 雙連通縮點

hdu 5409 題意 給乙個圖一些邊,保證圖連通 問對於每條邊,如果去除該邊後使得圖中一些點不連通。設這些點 u,v 要求使 u盡量小,v盡量大,輸出這樣的 u,v 否則輸出 0 0。思路 感謝 基本的思路就是找橋,然後橋兩端找找對應的最大u 和最小v。自己寫的時候寫完找橋就不會了,而且找橋找的特...

hdu3394Railway 雙連通分量

題目描述 給出一張無向圖,分別求出圖中滿足如下兩種條件的邊的數量 1 該邊不在任何簡單環當中 2 該邊在多個簡單環當中 方法 不在任何簡單環當中的,就是圖中的橋,可以求出來 通過簡單環聯想到點雙連通分量,找到某個雙連通分量,若該雙連通分量包含的邊數超過該點雙連通分量包含的點數,那麼這個雙 連通分量中...