1. 程式人生 > >Luogu P1195 口袋的天空

Luogu P1195 口袋的天空

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 口袋的天空