小杉坐在教室裡,透過口袋一樣的窗戶看口袋一樣的天空。
有很多雲飄在那裡,看起來很漂亮,小杉想摘下那樣美的幾朵雲,做成棉花糖。
給你雲朵的個數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 21 2 1
輸出樣例#1:
1
廈門一中yms原創
原題:洛谷p1195
題解:可以把題目中的每個棉花糖(marshmello??) 看成是一棵樹(每個棉花糖都是聯通的,由多個雲彩構成)
為了造出來這 k 個樹,我們需要用 n-k 條邊,花費 n-k 條邊的代價
為了讓代價最小,我們就考慮排序,造最小生成樹就行了
**如下:
#include usingnamespace
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個棉花糖,乙個棉花糖最少要用掉一朵雲,小杉想知道他怎麼連,花費的代價最小。輸入格式 每組測試...