SHOI2010 最小生成樹

2022-05-09 10:36:11 字數 1324 閱讀 8450

嘟嘟嘟

這道題的切入點在於模型的轉化。

令第\(lab\)條邊連線的兩個點分別為\(x, y\)。根據kruskal演算法,我們排完序加邊的時候,在執行第\(lab\)條邊之前,都要保證\(x, y\)不連通。這就很像最小割了。

所以我們把邊權小於\(w_\)的都拿來建圖,那邊權是啥咧?題中說的除了一條邊其餘的都減1,那不就相當於這條邊自己加1了嘛。那麼為了讓圖不連通,只需讓每一條邊的容量為\(w_ - w_i + 1\)即可。

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define enter puts("")

#define space putchar(' ')

#define mem(a, x) memset(a, x, sizeof(a))

#define in inline

typedef long long ll;

typedef double db;

const int inf = 0x3f3f3f3f;

const db eps = 1e-8;

const int maxn = 505;

const int maxm = 805;

inline ll read()

inline void write(ll x)

int n, m, t, id;

struct node

q[maxm];

struct edge

e[maxm << 2];

int head[maxn], ecnt = -1;

in void addedge(int x, int y, int w)

; head[x] = ecnt;

e[++ecnt] = (edge);

head[y] = ecnt;

}int dis[maxn];

in bool bfs()

}return dis[t];

}int cur[maxn];

in int dfs(int now, int res)

}return flow;

}in int mincut()

return flow;

}int main()

addedge(0, q[id].x, inf), addedge(q[id].y, t, inf);

write(mincut()), enter;

return 0;

}

題解 SHOI2010 最小生成樹

題目大意 在乙個合法的連通圖中,每條邊都有乙個邊權,我們欽定一條邊。然後對圖進行一些操作 將某一條邊的權值 1或 1。請問至少多少次後可以使欽定的邊出現在該圖的最小生成樹中。luogu傳送門 shoi2010 最小生成樹 解題思路 說實話 我們一定要跳出題目的侷限性,畢竟網路流是屬於圖演算法。我們考...

SHOI2010 最小生成樹(貪心)(最小割)

首先這個全域性 1可以等價成單點 1。考慮建樹的kruskal演算法。發現其實就是要求在加入權值小於等於這條邊的那些邊的時候,s,t s,ts,t不連通。顯然最小割。include define ll long long define re register define cs const cs i...

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...