題目鏈結
題意:給乙個連通的無向圖。每條邊有乙個炸掉的代價。如今要建一條邊(你不不知道的),然後你要求乙個你須要的最少代價,保證無論他建在哪,你都能炸掉使得圖不連通
思路:炸肯定要炸橋,所以先雙連通縮點,得到一棵樹,樹邊是要炸的,那麼找乙個最小值的邊。從該邊的兩點出發。走的路徑中,把兩條包括最小值的路徑。的兩點連邊。形成乙個環。這個環就保證了最低代價在裡面。除了這個環以外的最小邊。就是答案,這種話,就利用乙個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 該邊在多個簡單環當中 方法 不在任何簡單環當中的,就是圖中的橋,可以求出來 通過簡單環聯想到點雙連通分量,找到某個雙連通分量,若該雙連通分量包含的邊數超過該點雙連通分量包含的點數,那麼這個雙 連通分量中...