標籤 雲端
難度 普及+/提高
時空限制 1s / 128mb
小杉坐在教室裡,透過口袋一樣的窗戶看口袋一樣的天空。
有很多雲飄在那裡,看起來很漂亮,小杉想摘下那樣美的幾朵雲,做成棉花糖。
給你雲朵的個數n,再給你m個關係,表示哪些雲朵可以連在一起。
現在小杉要把所有雲朵連成k個棉花糖,乙個棉花糖最少要用掉一朵雲,小杉想知道他怎麼連,花費的代價最小。
輸入格式:
每組測試資料的
第一行有三個數n,m,k(1<=n<=1000,1<=m<=10000,1<=k<=10)
接下來m個數每行三個數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:1 2 1
1廈門一中yms原創
思路:
首先要想明白題目讓你做什麼:
更改成通俗的話就是將n個點再新增上幾條邊之後變為k個點,並且使得連邊的花費達到最小
那麼就很明白啦~如下圖:
想要將8個點,變為3個點,所以需要搞乙個最小生成樹,將與其他邊相連時邊權較小的6個點連起來,如下圖:
然後 通過大量的實驗可以的證:
只需要搞乙個點數為n-k的最小生成樹即可成功
上**:
#include #includeusing
namespace
std;
const
int inf = 0x7fffffff
;const
int n = 1010
;const
int m = 10010
;int
n,m,k,ans,cnt;
intdad[n];
struct
sky
}s[m];
int getdad(int
x)void
kruskal()
if(cnt==k)//
此時的k為輸入的n-k
break
; }
if(cnt
cout
<
}void add(int b,int u,int v,int
w)int
main()
kruskal();
return0;
}
luogu P1195 口袋的天空
小杉坐在教室裡,透過口袋一樣的窗戶看口袋一樣的天空。有很多雲飄在那裡,看起來很漂亮,小杉想摘下那樣美的幾朵雲,做成棉花糖。給你雲朵的個數n,再給你m個關係,表示哪些雲朵可以連在一起。現在小杉要把所有雲朵連成k個棉花糖,乙個棉花糖最少要用掉一朵雲,小杉想知道他怎麼連,花費的代價最小。輸入格式 每組測試...
luoguP1195 口袋的天空
emmmmm 最小生成樹,kruskal 大概是dtx教的,這道題是學長推薦做的 我點名要水題 超喜歡題面嗷 漂亮的天空上有漂亮的雲彩,漂亮的孩子做著漂亮的夢 而且立刻聯想到小雲彩嗷嗷嗷 qwq 無視以上廢話,看題 其實和最小生成樹的模版題沒什麼區別 悄咪咪表示某谷測試點裡沒有輸出orz的點 我們只...
P1195 口袋的天空
小杉坐在教室裡,透過口袋一樣的窗戶看口袋一樣的天空。有很多雲飄在那裡,看起來很漂亮,小杉想摘下那樣美的幾朵雲,做成棉花糖。給你雲朵的個數n,再給你m個關係,表示哪些雲朵可以連在一起。現在小杉要把所有雲朵連成k個棉花糖,乙個棉花糖最少要用掉一朵雲,小杉想知道他怎麼連,花費的代價最小。輸入格式 每組測試...