給你雲朵的個數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 21 2 1
輸出樣例#1: 複製
1
廈門一中yms原創
最小生成樹的變式
我們先建立乙個樸素最小生成樹,為了得到k個最下生成樹,我們相當於就是減掉k-1條邊就行了,那麼這k-1條邊一定是越大越好
但是我們已經sort一次啦呀,這已經完全ok啦啊
那就早點跳出去嘛,cnt=n-k的時候跳出去就可以了
#include usingnamespace
std;
typedef
long
long
ll;#define inf 2147483647
const ll inf =0x3f3f3f3f3f3f3f3fll;
#define ri register inttemplate
inline t min(t a, t b, t c)
template
inline t max(t a, t b, t c)
template
inline t min(t a, t b, t c, t d)
template
inline t max(t a, t b, t c, t d)
#define scanf1(x) scanf("%d", &x)
#define scanf2(x, y) scanf("%d%d", &x, &y)
#define scanf3(x, y, z) scanf("%d%d%d", &x, &y, &z)
#define scanf4(x, y, z, x) scanf("%d%d%d%d", &x, &y, &z, &x)
#define pi acos(-1)
#define me(x, y) memset(x, y, sizeof(x));
#define for(i, a, b) for (int i = a; i <= b; i++)
#define ffor(i, a, b) for (int i = a; i >= b; i--)
#define bug printf("***********\n");
#define mp make_pair
#define pb push_back
const
int n = 100005;//
name*******************************
struct
edge
e[n];
intpre[n];
intrank[n];
int cnt=0
;int ans=0
;int
n,m,k;
//function******************************
bool
cmp(edge x,edge y)
void init(int
x)int find(int
x)
returnr;}
void unionone(int a,int
b)//
***************************************
intmain()}}
cout
<<"
no answer";
return0;
}
P1195 口袋的天空
小杉坐在教室裡,透過口袋一樣的窗戶看口袋一樣的天空。有很多雲飄在那裡,看起來很漂亮,小杉想摘下那樣美的幾朵雲,做成棉花糖。給你雲朵的個數n,再給你m個關係,表示哪些雲朵可以連在一起。現在小杉要把所有雲朵連成k個棉花糖,乙個棉花糖最少要用掉一朵雲,小杉想知道他怎麼連,花費的代價最小。輸入格式 每組測試...
P1195 口袋的天空
小杉坐在教室裡,透過口袋一樣的窗戶看口袋一樣的天空。有很多雲飄在那裡,看起來很漂亮,小杉想摘下那樣美的幾朵雲,做成棉花糖。給你雲朵的個數n,再給你m個關係,表示哪些雲朵可以連在一起。現在小杉要把所有雲朵連成k個棉花糖,乙個棉花糖最少要用掉一朵雲,小杉想知道他怎麼連,花費的代價最小。輸入格式 每組測試...
P1195 口袋的天空
小杉坐在教室裡,透過口袋一樣的窗戶看口袋一樣的天空。有很多雲飄在那裡,看起來很漂亮,小杉想摘下那樣美的幾朵雲,做成棉花糖。給你雲朵的個數n,再給你m個關係,表示哪些雲朵可以連在一起。現在小杉要把所有雲朵連成k個棉花糖,乙個棉花糖最少要用掉一朵雲,小杉想知道他怎麼連,花費的代價最小。輸入格式 每組測試...