博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Luogu P1195 口袋的天空
阅读量:5264 次
发布时间:2019-06-14

本文共 1615 字,大约阅读时间需要 5 分钟。

题目地址

 

题目背景

小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空。

有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖。

题目描述

给你云朵的个数 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 21 2 1

 

输出样例#1:
1

 

说明

厦门一中YMS原创

 


 

思路

根据题目所说,我们将一个棉花糖看做一棵树,那么一共要生成K棵树

我们知道一棵有N个节点的树一共有N-1条边,那么对于N个节点,要有K棵树的话就要先生成一棵有N-K条边的树

其余的K-1个节点,每个节点作为一棵树

这就完成了K棵树

要使得代价最小,那么就要用最小生成树算法

代码

#include 
#include
#include
#include
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);}

 

转载于:https://www.cnblogs.com/bljfy/p/9260727.html

你可能感兴趣的文章
设计模式课程 设计模式精讲 2-2 UML类图讲解
查看>>
linux后台运行和关闭SSH运行,查看后台任务
查看>>
C# Dynamic通用反序列化Json类型并遍历属性比较
查看>>
exit和return的区别
查看>>
Python(软件目录结构规范)
查看>>
c++||template
查看>>
条件断点 符号断点
查看>>
Dreamweaver cc新版本css单行显示
查看>>
Java基础教程——网络基础知识
查看>>
Kruskal基础最小生成树
查看>>
【hdu 1429】胜利大逃亡(续)
查看>>
javascript之Style物
查看>>
Factory Design Pattern
查看>>
P1192-台阶问题
查看>>
Java线程面试题
查看>>
【BZOJ4516】生成魔咒(后缀自动机)
查看>>
提高PHP性能的10条建议
查看>>
Java大数——a^b + b^a
查看>>
简单的数据库操作
查看>>
帧的最小长度 CSMA/CD
查看>>