題目背景
小杉坐在教室裡,透過口袋一樣的窗戶看口袋一樣的天空。
有很多雲飄在那裡,看起來很漂亮,小杉想摘下那樣美的幾朵雲,做成棉花糖。
題目描述
給你雲朵的個數n,再給你m個關係,表示哪些雲朵可以連在一起。
現在小杉要把所有雲朵連成k個棉花糖,乙個棉花糖最少要用掉一朵雲,小杉想知道他怎麼連,花費的代價最小。
輸入格式
每組測試資料的
第一行有三個數n,m,k(1 \le n \le 1000,1 \le m \le 10000,1 \le k \le 10)n,m,k(1≤n≤1000,1≤m≤10000,1≤k≤10)
接下來mm個數每行三個數x,y,lx,y,l,表示xx雲和yy雲可以通過ll的代價連在一起。(1 \le x,y \le n,0 \le l<10000)(1≤x,y≤n,0≤l<10000)
%30%的資料n \le 100,m \le 1000n≤100,m≤1000
輸出格式
對每組資料輸出一行,僅有乙個整數,表示最小的代價。
如果怎麼連都連不出kk個棉花糖,請輸出』no answer』。
輸入輸出樣例
輸入 #1
3 1 2
1 2 1
輸出 #1
1說明/提示
廈門一中yms原創
最小生成樹模板題
但這裡有乙個地方需要注意,就是這裡最後生成的並不是一棵樹,而是k棵樹。
因為題目要求花費代價最少,那麼我們仍然用構造最小生成樹的方法:
在構造最小生成樹的之前,我們先定每乙個結點都是一顆子樹,那麼我們再根據克魯斯卡爾演算法的貪心思路從小到大根據兩個子樹合併代價排序,然後按照這個順序合併子樹,直到子樹數量為k就可以了。
#include
#include
#include
#include
using
namespace std;
struct czp
a[10001];
int fa[
100001
],n,m,p,ans;
intcmp
(czp x1,czp x2)
intfind
(int x)
//並查集路徑壓縮
intmain()
if(n==p)
//與最小生成樹模板不同的地方就在這裡,其他都一樣。
//因為並不是最後連成一棵樹
}printf
("no answer\n");
return0;
}
洛谷P1195 口袋的天空
小杉坐在教室裡,透過口袋一樣的窗戶看口袋一樣的天空。有很多雲飄在那裡,看起來很漂亮,小杉想摘下那樣美的幾朵雲,做成棉花糖。給你雲朵的個數n,再給你m個關係,表示哪些雲朵可以連在一起。現在小杉要把所有雲朵連成k個棉花糖,乙個棉花糖最少要用掉一朵雲,小杉想知道他怎麼連,花費的代價最小。輸入格式 每組測試...
洛谷P1195 口袋的天空
小杉坐在教室裡,透過口袋一樣的窗戶看口袋一樣的天空。有很多雲飄在那裡,看起來很漂亮,小杉想摘下那樣美的幾朵雲,做成棉花糖。給你雲朵的個數 n 再給你 m 個關係,表示哪些雲朵可以連在一起。現在小杉要把所有雲朵連成 k 個棉花糖,乙個棉花糖最少要用掉一朵雲,小杉想知道他怎麼連,花費的代價最小。輸入格式...
P1195 口袋的天空 洛谷
小杉坐在教室裡,透過口袋一樣的窗戶看口袋一樣的天空。有很多雲飄在那裡,看起來很漂亮,小杉想摘下那樣美的幾朵雲,做成棉花糖。給你雲朵的個數n,再給你m個關係,表示哪些雲朵可以連在一起。現在小杉要把所有雲朵連成k個棉花糖,乙個棉花糖最少要用掉一朵雲,小杉想知道他怎麼連,花費的代價最小。輸入格式 每組測試...