小杉坐在教室裡,透過口袋一樣的窗戶看口袋一樣的天空。
有很多雲飄在那裡,看起來很漂亮,小杉想摘下那樣美的幾朵雲,做成棉花糖。
給你雲朵的個數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原創
1.這道題題意是讓你在求最小生成樹的時候特判,判斷什麼時候停止粘合節點
2.於題意,我們便在普通的kruskal演算法做點小修改,直接在製造最小生成樹的時候判斷節點數與k值得關係即可
基本上可以套用最小生成樹的演算法
改幾句話就可以了,
下面給出**及部分注釋
1 #include2 #include3using
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 2const
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個棉花糖,乙個棉花糖最少要用掉一朵雲,小杉想知道他怎麼連,花費的代價最小。輸入格式 每組測試...