P1195 口袋的天空

2021-09-07 14:43:45 字數 2018 閱讀 7476

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

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

給你雲朵的個數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原創

1.這道題題意是讓你在求最小生成樹的時候特判,判斷什麼時候停止粘合節點

2.於題意,我們便在普通的kruskal演算法做點小修改,直接在製造最小生成樹的時候判斷節點數與k值得關係即可

基本上可以套用最小生成樹的演算法

改幾句話就可以了,

下面給出**及部分注釋

1 #include2 #include3

using

namespace

std;

4int en,f[10009

],m,n,siz,k;

5struct

edgeed[10009];8

void add_edge(int s,int e,int

d)12

bool

operator

< (const edge &a,const edge &b)

15int getf(int

now)

19int

kruskal()

32if(siz == k)return ans; //

符合答案要求,可以組成k個棉花糖 ,則返回答案33}

34return -1; //

如果之前沒有直接返回答案,則說明不能組成k個棉花糖則返回-1 35}

36int

main()

43int ans =kruskal();

44if(ans == -1)printf("

no answer\n

"); //

無答案

45else printf("

%d\n

",ans); //

輸出 46

return0;

47 }

兩個低階錯誤,搞死我

1、第21行,if(x==f[x]) return x;// x==f[x]寫成了x=f[x] 

2、第22行,else return f[x]=find(f[x]);//這裡寫成了f[x]=f[f[x]] 

3、錯了的話,一定是自己****有問題

1 #include 2

const

int maxn=1e4+10;3

using

namespace

std;

4struct

node

9}g[maxn];

10int

f[maxn];

11int

n,m,k;

1213

void

init()

1920

int find(int

x)24

25int

kruskal()

35if(n1==k) return

w;36}37

return -1;38

}3940int

main()

P1195 口袋的天空

給你雲朵的個數n,再給你m個關係,表示哪些雲朵可以連在一起。現在小杉要把所有雲朵連成k個棉花糖,乙個棉花糖最少要用掉一朵雲,小杉想知道他怎麼連,花費的代價最小。輸入格式 每組測試資料的 第一行有三個數n,m,k 1 n 1000,1 m 10000,1 k 10 接下來m個數每行三個數x,y,l,表...

P1195 口袋的天空

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

P1195 口袋的天空

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