[每日一题]:建立联系 -- 最小生成树
时间:2020-04-25
本文章向大家介绍[每日一题]:建立联系 -- 最小生成树,主要包括[每日一题]:建立联系 -- 最小生成树使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目:
考察点:
最小生成树,语文阅读能力的水平
侃侃:
首先,题目中给的 K 并不是要我们去从所有的关系中找 k 个人,而是告诉我们
现在已经有 K 个人组成一团了,那么还有几个人孤苦伶仃呢?当然是 n - k 个
人了,假设 原先的那 k 个人就是一个整体,那么现在要将这 n - k 个人和 k
组成一个大的整体(请仔细阅读最后的那句话,人与人之间,且一定存在答案)
我们要将 n - k 个人和原来的 k 联合到一起需要几条边呢?
我们发现要想都联系到一起,还需要 n - k 条边。
题目要求我们最后使得连到一起的代价最小,怎么就最小了呢?
我们发现这 k 个人是不确定的,那什么是确定的呢?我们需要加几条边是确定的,也就是我
们可以按照 权值大小进行从小到大排序,找 N - k 条边即可。
Code:
#include <set>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 5e5 + 10;
typedef long long LL;
struct node {
LL u,v,w;
}friends[maxn];
LL fa[maxn];
LL n,m,k;
// 查找
LL get(LL x) {
return x == fa[x] ? x : fa[x] = get(fa[x]);
}
// 合并
void Union(LL x,LL y) {
LL xx = get(x);
LL yy = get(y);
if(xx == yy) return;
fa[yy] = xx;
return ;
}
bool cmp(node a,node b) {
return a.w < b.w;
}
int main(void) {
scanf("%lld%lld%lld",&n,&m,&k);
for(int i = 1; i <= m; i ++) {
scanf("%lld%lld%lld",&friends[i].u,&friends[i].v,&friends[i].w);
}
// 初始化
for(int i = 0; i <= n; i ++) {
fa[i] = i;
}
// 按照权值从小到大排序
sort(friends + 1,friends + 1 + m,cmp);
LL res = 0;
LL t = 0;
for(int i = 1; i <= m; i ++) {
LL u = friends[i].u;
LL v = friends[i].v;
// 寻找 n - k 条边即可
if(get(u) != get(v)) {
Union(u,v);
res += friends[i].w;
t ++;
}
if(t == n - k) break;
}
printf("%lld\n",res);
return 0;
}
后记:
计蒜客这模拟赛的题水平可以啊,哈哈,高估了自己,低估了蒜你狠。
在 k 这里还拐个弯,一定要认真读题,否则,调都不知道何处下手。
对了,记得开 long long.
师傅说 :
三年 OI 一场空,不开 long long 见祖宗。
(精辟)
原文地址:https://www.cnblogs.com/prjruckyone/p/12774500.html
- 05-01总结方法,数组(一维)
- 02 Java类的加载机制
- 权限管理系统
- 03 JVM的垃圾回收机制
- Tomcat就是这么简单
- Servlet第三篇【request和response介绍、response的常见应用】
- 通过java来格式化sql语句(r4笔记第61天)
- Servlet第四篇【request对象常用方法、应用】
- Servlet第五篇【介绍会话技术、Cookie的API、详解、应用】
- Java类加载器(用户自定义类加载器实现)
- Servlet第六篇【Session介绍、API、生命周期、应用、与Cookie区别】
- 一个oracle蠕虫病毒 (r4笔记第60天)
- 提高效率,eclipse上你可能不知道的技巧
- AJAX入门这一篇就够了
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- css Backgroud-clip (文字颜色渐变)
- 微信小程序 buton清除默认样式
- 正则replace 回调函数里接收的参数是什么?
- 微信小程序使用pako.js的踩坑笔记
- Koa - 初体验(写个接口)
- Koa - 中间件(理解中间件、实现一个验证token中间件)
- Koa - 使用koa-multer上传文件(上传限制、错误处理)
- 原生js 复制内容到剪切板
- Vue - watch高阶用法
- 小程序如何支持使用 async/await (构建npm版)
- require.context批量引入文件
- Node笔记 - process.cwd() 和 __dirname 的区别
- 小程序如何支持使用 async/await
- 小程序 - 如何自定义导航栏
- protobuf 语法 与 protocol-buffers 的使用