CH 6201走廊潑水節

2021-09-21 07:08:47 字數 1667 閱讀 5819

描述

【簡化版題意】給定一棵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...