UVa1668/LA6039 Let’s Go Green

2024-08-23 06:36
文章标签 go let green uva1668 la6039

本文主要是介绍UVa1668/LA6039 Let’s Go Green,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

UVa1668/LA6039 Let’s Go Green

  • 题目链接
  • 题意
  • 分析
  • AC 代码

题目链接

  本题是2012年icpc亚洲区域赛雅加达(Jakarta)赛区的题目

题意

  输入一棵n(2≤n≤100000)个结点的树,每条边上都有一个权值。要求用最少的路径覆盖这些边,使得每条边被覆盖的次数等于它的权值,如下图所示。
Let’s Go Green

分析

  本题和最小路径覆盖问题看着很像,但最小路径覆盖问题是有向图且要求每个点只在一条路径上。本题和UVa1664/LA6070 Conquer a New Region一个套路,表面是图论题,实际考的是数据结构——并查集。
  先分析本题的一个简单版本:如果树上只有一个点的度大于1,其余点的度都是1,最少的路径数是多少呢?计所有边权和为 s s s,最大边权为 x x x,思考一下可知最小路径数为 m a x ( ⌈ s 2 ⌉ , x ) max(\lceil \frac s 2 \rceil,x) max(⌈2s,x)
  现在解题思路就有了:考虑每个点 i i i关联的所有边,权和为 s i s_i si,最大边权为 x i x_i xi,则其关联边构成的子图最小路径数为 c i = m a x ( ⌈ s i 2 ⌉ , x i ) c_i=max(\lceil \frac {s_i} 2 \rceil,x_i) ci=max(⌈2si,xi)。枚举每条边 ( u , v , w ) (u,v,w) (u,v,w),用并查集将两端点各自关联的所有边子图依次合并就可以得出答案, u , v u,v u,v合并的子图最小路径数为 c u + c v − w c_u+c_v-w cu+cvw

AC 代码

#include <iostream>
using namespace std;#define N 100010
int u[N], v[N], w[N], x[N], s[N], f[N], n;int find(int x) {return x == f[x] ? x : f[x] = find(f[x]);
}int solve() {cin >> n;for (int i=1; i<=n; ++i) x[i] = s[i] = 0, f[i] = i;for (int i=1; i<n; ++i) {cin >> u[i] >> v[i] >> w[i]; s[u[i]] += w[i]; s[v[i]] += w[i];x[u[i]] = max(x[u[i]], w[i]); x[v[i]] = max(x[v[i]], w[i]);}for (int i=1; i<=n; ++i) s[i] = max(x[i], (s[i]+1) >> 1);int cc = 0;for (int i=1; i<n; ++i) {int x = find(u[i]), y = find(v[i]); f[x] = y; cc = s[y] += s[x] - w[i];}return cc;
}int main() {ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);int t; cin >> t;for (int k=1; k<=t; ++k) cout << "Case #" << k << ": " << solve() << endl;return 0;
}

这篇关于UVa1668/LA6039 Let’s Go Green的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1098623

相关文章

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

Go Gorm 示例详解

《GoGorm示例详解》Gorm是一款高性能的GolangORM库,便于开发人员提高效率,本文介绍了Gorm的基本概念、数据库连接、基本操作(创建表、新增记录、查询记录、修改记录、删除记录)等,本... 目录1. 概念2. 数据库连接2.1 安装依赖2.2 连接数据库3. 数据库基本操作3.1 创建表(表关

Go信号处理如何优雅地关闭你的应用

《Go信号处理如何优雅地关闭你的应用》Go中的优雅关闭机制使得在应用程序接收到终止信号时,能够进行平滑的资源清理,通过使用context来管理goroutine的生命周期,结合signal... 目录1. 什么是信号处理?2. 如何优雅地关闭 Go 应用?3. 代码实现3.1 基本的信号捕获和优雅关闭3.2

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

Go Select的实现

select语法总结 select对应的每个case如果有已经准备好的case 则进行chan读写操作;若没有则执行defualt语句;若都没有则阻塞当前goroutine,直到某个chan准备好可读或可写,完成对应的case后退出。 Select的内存布局 了解chanel的实现后对select的语法有个疑问,select如何实现多路复用的,为什么没有在第一个channel操作时阻塞 从而导

Go Channel的实现

channel作为goroutine间通信和同步的重要途径,是Go runtime层实现CSP并发模型重要的成员。在不理解底层实现时,经常在使用中对channe相关语法的表现感到疑惑,尤其是select case的行为。因此在了解channel的应用前先看一眼channel的实现。 Channel内存布局 channel是go的内置类型,它可以被存储到变量中,可以作为函数的参数或返回值,它在r