鏈結太長放不下
給定一棵n
nn個節點的樹,要求增加若干條邊,把這棵樹擴充為完全圖,並完全圖的唯一最小生成樹仍然是這棵樹。求增加的邊的權值總和最小是多少。
資料範圍:n
≤6000
n\leq6000
n≤6000
,原有的邊權均為非負整數
首先題目要求完全圖的唯一最小生成樹仍然是這棵樹
,所以對於對兩個點集合x
xx,y
yy之間的連邊必須大於原長度,而又要求最小,所以自然是權值+1
那麼我們對於一條邊(x,
y,w)
(x,y,w)
(x,y,w
),設s
xs_x
sx表示x
xx所在的點集,s
ys_y
sy表示y
yy所在的點集,而s
xs_x
sx與s
ys_y
sy之間必定會新增∣sx
∣+∣s
y∣−1
|s_x|+|s_y|-1
∣sx∣+
∣sy
∣−1條邊,而每條邊的長度都為w+1
w+1w+
1,如圖
作圖網頁processon
#include
#include
#include
using
namespace std;
int n,f[
6010
],s[
6010
],t;
long
long ans;
inline
char
getchar()
return
*p1++;}
inline
intread()
inline
void
write
(register
long
long x)
//以上為輸入輸出優化
struct nodeedge[
6010];
inline
bool
cmp(node x,node y)
//排序
inline
intfind
(register
int x)
//判斷所處集合
signed
main()
;sort
(edge+
1,edge+n,cmp)
;for
(register
int i=
1;i<=n;i++
) f[i]
=i,s[i]=1
; ans=0;
for(
register
int i=
1;i)write
(ans)
;putchar(10
);}}
走廊潑水節(TYVJ1391)
演算法 圖論 最小生成樹 分析 題目大意在tyvj上說的不是很清楚,這裡再說明一下,就是說給出了乙個不完全圖 最小生成樹 在這個不完全圖中新增邊使之成為完全圖,同時新增完邊之後必須能保證不破壞原來的最小生成樹。可以採用kruskal解決,我們知道kruskal的最終目的是將兩棵最小生成樹合成一棵,設...
tyvj 1391 走廊潑水節
p1391 走廊潑水節 背景話說,中中帶領的oier們打算舉行一次冬季潑水節,當然這是要秘密進行的,絕對不可以讓中中知道。不過中中可是 湖了,當然很快就發現了我們的小陰謀,於是他準備好水槍迫不及待的想要加入我們了。描述我們一共有n個oier打算參加這個潑水節,同時很湊巧的是正好有n個水龍頭 至於為什...
tyvj1391走廊潑水節 kruskal
題目 大意就是把乙個樹擴充成乙個完全圖,並且圖中最小生成樹仍是原來的樹。思路很巧妙,把邊按權值從小到大排序,然後模擬加邊的過程,並查集記錄左右兩邊連通塊的大小 這樣每新加一條邊合併兩個並查集 完全圖 可知此時兩邊的圖中每個點互相連邊的最優選擇就是連線這兩個圖的那條邊的邊權 1 這樣求最小生成樹時要連...