luoguP1195 口袋的天空

2022-04-06 04:55:57 字數 1775 閱讀 1081

標籤 雲端

難度 普及+/提高

時空限制 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 2 1

輸出樣例#1:

1
廈門一中yms原創

思路:

首先要想明白題目讓你做什麼:

更改成通俗的話就是將n個點再新增上幾條邊之後變為k個點,並且使得連邊的花費達到最小

那麼就很明白啦~如下圖:

想要將8個點,變為3個點,所以需要搞乙個最小生成樹,將與其他邊相連時邊權較小的6個點連起來,如下圖:

然後 通過大量的實驗可以的證:

只需要搞乙個點數為n-k的最小生成樹即可成功

上**:

#include #include 

using

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個棉花糖,乙個棉花糖最少要用掉一朵雲,小杉想知道他怎麼連,花費的代價最小。輸入格式 每組測試...