Luogu P1195 口袋的天空
阿新 • • 發佈:2018-07-04
range 描述 ios turn 輸入格式 name class cst 背景
題目地址
https://www.luogu.org/problemnew/show/P1195
題目背景
小杉坐在教室裏,透過口袋一樣的窗戶看口袋一樣的天空。
有很多雲飄在那裏,看起來很漂亮,小杉想摘下那樣美的幾朵雲,做成棉花糖。
題目描述
給你雲朵的個數 N ,再給你 M 個關系,表示哪些雲朵可以連在一起。
現在小杉要把所有雲朵連成 K 個棉花糖,一個棉花糖最少要用掉一朵雲,小杉想知道他怎麽連,花費的代價最小。
輸入輸出格式
輸入格式:
每組測試數據的
第一行有三個數 $N,M,K(1 \le N \le 1000,1 \le M \le 10000,1 \le K \le 10)N,M,K(1≤N≤1000,1≤M≤10000,1≤K≤10)$
接下來 MM 個數每行三個數 X,Y,LX,Y,L ,表示 XX 雲和 YY 雲可以通過 LL 的代價連在一起。$ (1 \le X,Y \le N,0 \le L<10000)(1≤X,Y≤N,0≤L<10000)$
30\%30% 的數據 $N \le 100,M \le 1000N≤100,M≤1000$
輸出格式:
對每組數據輸出一行,僅有一個整數,表示最小的代價。
如果怎麽連都連不出 K 個棉花糖,請輸出‘No Answer‘。
輸入輸出樣例
輸入樣例#1:3 1 2 1 2 1
輸出樣例#1:
1
說明
廈門一中YMS原創
思路
根據題目所說,我們將一個棉花糖看做一棵樹,那麽一共要生成K棵樹
我們知道一棵有N個節點的樹一共有N-1條邊,那麽對於N個節點,要有K棵樹的話就要先生成一棵有N-K條邊的樹
其余的K-1個節點,每個節點作為一棵樹
這就完成了K棵樹
要使得代價最小,那麽就要用最小生成樹算法
代碼
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> const int maxn = 1003;using namespace std; int n, m, k, f[maxn], tot, Ans; struct edge{ int u, v, w; }ed[10003]; int find(int x) { if(f[x] == x) return x; else return f[x] = find(f[x]); } bool cmp(edge a, edge b) { return a.w < b.w; } int main() { scanf("%d%d%d", &n, &m, &k); for(int i=1; i<=n; i++) f[i] = i; for(int i=1; i<=m; i++) { scanf("%d%d%d", &ed[i].u, &ed[i].v, &ed[i].w); } sort(ed+1, ed+1+m, cmp); for(int i=1; i<=m; i++) { int xx = find(ed[i].u), yy = find(ed[i].v); if(xx != yy) { f[xx] = find(yy); tot++; Ans += ed[i].w; } if(tot == n-k) break; } if(tot < n-k) { printf("No Answer\n"); return 0; } printf("%d", Ans); }
Luogu P1195 口袋的天空