口袋的天空

2022-08-20 01:24:13 字數 1339 閱讀 7829

小杉坐在教室裡,透過口袋一樣的窗戶看口袋一樣的天空。

有很多雲飄在那裡,看起來很漂亮,小杉想摘下那樣美的幾朵雲,做成棉花糖。

給你雲朵的個數n,再給你m個關係,表示哪些雲朵可以連在一起。

現在小杉要把所有雲朵連成k個棉花糖,乙個棉花糖最少要用掉一朵雲,小杉想知道他怎麼連,花費的代價最小。

輸入格式:

每組測試資料的

第一行有三個數n,m,k(1≤n≤1000,1≤m≤10000,1≤k≤10)

接下來mm個數每行三個數x,y,l,表示x雲和y雲可以通過l的代價連在一起。(1≤x,y≤n,0≤l<10000)

30%的資料n <= 100,m <=1000

輸出格式:

對每組資料輸出一行,僅有乙個整數,表示最小的代價。

如果怎麼連都連不出k個棉花糖,請輸出'no answer'。

輸入樣例#1: 

3 1 2

1 2 1

輸出樣例#1: 

1

廈門一中yms原創

原題:洛谷p1195

題解:可以把題目中的每個棉花糖(marshmello??) 看成是一棵樹(每個棉花糖都是聯通的,由多個雲彩構成)

為了造出來這 k 個樹,我們需要用 n-k 條邊,花費 n-k 條邊的代價

為了讓代價最小,我們就考慮排序,造最小生成樹就行了

**如下:

#include using

namespace

std;

inline

intread()

const

int maxn = 1e5 + 10

;const

int maxedge = 1e5 + 10

;struct

edge

}edge[maxn];

intf[maxn];

intn , m , k , sum , ans;

int find(int

x)

return

f[x];

}inline

void

make()

}inline

void merge(int x , int

y) int

main()

sort(edge + 1 , edge + m + 1

);

make();

for (int i = 1 ; i <= m ; i ++)

if (sum == n -k)

}puts(

"no answer");

}

口袋的天空

小杉坐在教室裡,透過口袋一樣的窗戶看口袋一樣的天空。有很多雲飄在那裡,看起來很漂亮,小杉想摘下那樣美的幾朵雲,做成棉花糖。給你雲朵的個數n,再給你m個關係,表示哪些雲朵可以連在一起。現在小杉要把所有雲朵連成k個棉花糖,乙個棉花糖最少要用掉一朵雲,小杉想知道他怎麼連,花費的代價最小。輸入格式 每組測試...

口袋的天空

我tm又把n和m打反了。為什麼我找到的並查集的題都基本上可以用kruskal做啊。並查集明明可以幹很多事情的好不好。既然要把n個點連成k個 塊 那自然想到連邊要連n k條。我們對所有邊資訊按照邊權公升序排序,然後列舉所有邊,如果有一條邊連線的兩個點不在同一集合就合併並維護相關資訊。這tm還是krus...

P1195 口袋的天空

小杉坐在教室裡,透過口袋一樣的窗戶看口袋一樣的天空。有很多雲飄在那裡,看起來很漂亮,小杉想摘下那樣美的幾朵雲,做成棉花糖。給你雲朵的個數n,再給你m個關係,表示哪些雲朵可以連在一起。現在小杉要把所有雲朵連成k個棉花糖,乙個棉花糖最少要用掉一朵雲,小杉想知道他怎麼連,花費的代價最小。輸入格式 每組測試...