P1195 口袋的天空

2022-05-03 13:24:13 字數 1666 閱讀 7466

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

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

給你雲朵的個數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個點被n-1條邊連線的話,這一定是棵樹。

那麼:

連的邊數 得到的樹的個數

n-1 1

n-2 2

n-3 3

... ...

n-k k

所以我們如果想要連出k棵樹,就需要連n-k條邊。

題目要求用n朵雲連出k個棉花糖。

因為每個棉花糖都是連通的,

那麼每個棉花糖就相當於是一棵樹。

就是說要用n個節點連出k棵樹。

也就是說要用n-k條邊連出k棵樹。

也就是說要花費連出n-k條邊的代價。

既然一定要花費連出n-k條邊的代價,

那麼當然要選擇代價最小的邊連起來。

所以給每條可以連的邊按代價從小到大排個序,

然後連n-k條邊造k個最小生成樹就可以了。

如果給的關係數m小於需要連的邊數(n-k),是一定連不出k個樹來的,因為m個關係只能連m條邊。

*/#include

#include

#include

#include

#include

#define n 1005

using

namespace

std;

intn,m,k,x,y,l,sum,ans;

intfa[n];

struct

edge

}edge[n*10

];/*

bool operator <(edge a,edge b) //重置運算子的函式寫在外面的話不能加const

int find(int

x)int

main()

sort(edge+1,edge+m+1); //

按代價公升序排列

for(int i=1;i<=m;i++)

if(sum==n-k) //

已經連好了k棵樹

}puts(

"no answer

"); //

不可能連好

return0;

}

P1195 口袋的天空

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

P1195 口袋的天空

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

P1195 口袋的天空

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