描述
【簡化版題意】給定一棵n個節點的樹,要求增加若干條邊,把這棵樹擴充為完全圖,並滿足圖的唯一最小生成樹仍然是這棵樹。求增加的邊的權值總和最小是多少。
我們一共有n個oier打算參加這個潑水節,同時很湊巧的是正好有n個水龍頭(至於為什麼,我不解釋)。n個水龍頭之間正好有n-1條小道,並且每個水龍頭都可以經過小道到達其他水龍頭(這是一棵樹,你應該懂的…)。但是oier門為了迎接中中的挑戰,決定修建一些個道路(至於怎麼修,秘密),使得每個水龍頭到每個水龍頭之間都有一條直接的道路連線(也就是構成乙個完全圖唄)。但是oier門很懶得,並且記性也不好,他們只會去走那n-1條小道,並且希望所有水龍頭之間修建的道路,都要大於兩個水龍頭之前連線的所有小道(小道當然要是最短的了)。所以神cow們,幫那些oier們計算一下吧,修建的那些道路總長度最短是多少,畢竟修建道路是要破費的~~
輸入格式
本題為多組資料~
第一行t,表示有t組測試資料
對於每組資料
第一行n,表示水龍頭的個數(當然也是oier的個數);
2到n行,每行三個整數x,y,z;表示水龍頭x和水龍頭y有一條長度為z的小道
輸出格式
對於每組資料,輸出乙個整數,表示修建的所有道路總長度的最短值。
樣例輸入
2
31 2 2
1 3 3
41 2 3
2 3 4
3 4 5
樣例輸出4
17
資料範圍與約定
樣例解釋
第一組資料,在2和3之間修建一條長度為4的道路,是這棵樹變成乙個完全圖,且原來的樹依然是這個圖的唯一最小生成樹.
kruskal
在最小生成樹中連線兩個不同集合的邊必須是全權值最小的邊
兩個不同集合生成完全圖需要 ∣sx
∣∗∣s
y∣−1
|s_x| *|s_y|-1
∣sx∣∗
∣sy
∣−1 條邊,因為已經有一條(x,
y,z)
(x, y, z)
(x,y,z
)的邊了,這些新生成的邊要求最小值那麼就是 z+1
z + 1
z+1
#include
#include
using namespace std;
static
const
auto io_sync_off =
()()
;using ll =
long
long
;const
int maxn =
6005
;struct point edge[maxn]
;int f[maxn]
, cnt[maxn]
, n, t;
ll ans;
intfind
(int x)
intmain()
);for(
int i =
1; i <= n;
++i)
f[i]
= i, cnt[i]=1
;for
(int i =
1; i < n;
++i)
cout << ans <}return0;
}
CH6201 走廊潑水節
題目大意 給定一棵樹,要求增加若干條邊,將其轉化為完全圖,且該完全圖以該樹為唯一的最小生成樹,求增加的邊權最小是多少。題解 完全圖的問題一般要考慮組合計數。重新跑一遍克魯斯卡爾演算法,每次並查集在合併時進行計數,因為要求最小生成樹唯一,必須保證每條邊都比當前連線兩個聯通塊的邊要至少大 1,因此每次合...
CH6201 走廊潑水節 最小生成樹
描述 簡化版題意 給定一棵n個節點的樹,要求增加若干條邊,把這棵樹擴充為完全圖,並滿足圖的唯一最小生成樹仍然是這棵樹。求增加的邊的權值總和最小是多少。我們一共有n個oier打算參加這個潑水節,同時很湊巧的是正好有n個水龍頭 至於為什麼,我不解釋 n個水龍頭之間正好有n 1條小道,並且每個水龍頭都可以...
走廊潑水節
給定一棵n個節點的樹,要求增加若干條邊,把這棵樹擴充為完全圖,並滿足圖的唯一最小生成樹仍然是這棵樹。求增加的邊的權值總和最小是多少。輸入格式 第一行包含整數t,表示共有t組測試資料。對於每組測試資料,第一行包含整數n。接下來n 1行,每行三個整數x,y,z,表示x節點與y節點之間存在一條邊,長度為z...