首页 > 编程语言 >《算法竞赛进阶指南》 第六章 287. 积蓄程度

《算法竞赛进阶指南》 第六章 287. 积蓄程度

时间:2024-10-11 12:11:24浏览次数:1  
标签:进阶 idx int void 源点 河道 287 第六章 dp

// 502 extra.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

/*
287. 积蓄程度
https://www.acwing.com/problem/content/289/

有一个树形的水系,由 N−1条河道和 N 个交叉点组成。

我们可以把交叉点看作树中的节点,编号为 1∼N,河道则看作树中的无向边。

每条河道都有一个容量,连接 x 与 y 的河道的容量记为 c(x,y)。

河道中单位时间流过的水量不能超过河道的容量。

有一个节点是整个水系的发源地,可以源源不断地流出水,我们称之为源点。

除了源点之外,树中所有度数为 1 的节点都是入海口,可以吸收无限多的水,我们称之为汇点。

也就是说,水系中的水从源点出发,沿着每条河道,最终流向各个汇点。

在整个水系稳定时,每条河道中的水都以单位时间固定的水量流向固定的方向。

除源点和汇点之外,其余各点不贮存水,也就是流入该点的河道水量之和等于从该点流出的河道水量之和。

整个水系的流量就定义为源点单位时间发出的水量。
0.
在流量不超过河道容量的前提下,求哪个点作为源点时,整个水系的流量最大,输出这个最大值。

输入格式
输入第一行包含整数 T,表示共有 T 组测试数据。

每组测试数据,第一行包含整数 N。

接下来 N−1 行,每行包含三个整数 x,y,z
,表示 x,y 之间存在河道,且河道容量为 z。

节点编号从 1 开始。

输出格式
每组数据输出一个结果,每个结果占一行。

数据保证结果不超过 2^31−1。

数据范围
N≤2×10^5

输入样例:
1
5
1 2 11
1 4 13
3 4 5
4 5 10
输出样例:
26
*/



#include <iostream>
#include <algorithm>
#include <cstring>


using namespace std;

const int N = 200010;
int h[N], e[2 * N], ne[2 * N], w[2 * N], idx;
int  dp[N], v[N];
int n;

void add(int a, int b,int c) {
	e[idx] = b, w[idx]=c,ne[idx] = h[a], h[a] = idx++;
}

void up(int u, int fa) {
	bool isleaf = true;
	for (int i = h[u]; i != -1; i = ne[i]) {
		int j = e[i]; int c = w[i];
		if (j == fa) continue;
		isleaf = false;
		up(j, u);
		dp[u] += min(c, dp[j]);
	}

	if (isleaf) {
		dp[u] = 0x3f3f3f3f;
	}
}


void down(int u, int fa) {
	for (int i = h[u]; i != -1; i = ne[i]) {
		int j = e[i]; int c = w[i];
		if (j == fa) continue;

		v[j] = min(v[u] + dp[u] - min(c, dp[j]), c);
		if (v[j] == 0) {
			v[j] = c;
		}
		down(j, u);
	}
}

void solve() {
	memset(h, -1, sizeof h);
	memset(dp, 0, sizeof dp);
	memset(v, 0, sizeof v);

	cin >> n;
	for (int i = 2; i <= n; i++) {
		int  a, b, c; cin >> a >> b >> c;
		add(a, b, c); add(b, a, c);
	}

	up(1, -1);
	down(1, -1);

	int ans = 0;
	for (int i = 1; i <= n; i++) {
		if (dp[i] != 0x3f3f3f3f)
			ans = max(ans, v[i] + dp[i]);
		else
			ans = max(ans, v[i]);
	}

	cout << ans << endl;
}


int main()
{
	int T; cin >> T;
	while (T--) {
		solve();
	}

	return 0;
}

标签:进阶,idx,int,void,源点,河道,287,第六章,dp
From: https://www.cnblogs.com/itdef/p/18458113

相关文章

  • 『Mysql进阶』Mysql explain详解(五)
    目录Explain介绍Explain分析示例explain中的列1.id列2.select_type列3.table列4.partitions列5.type列6.possible_keys列7.key列8.key_len列9.ref列10.rows列11.filtered列12.Extra列Explain介绍    EXPLAIN语句提供有关M......
  • 《算法竞赛进阶指南》 第六章 325. 计算机
    /*325.计算机https://www.acwing.com/problem/content/description/327/一所学校前一段时间买了第一台计算机(所以这台计算机的ID是1)。近年来,学校又购买了N−1台新计算机。每台新计算机都与之前买进的计算机中的一台建立连接。现在请你求出第i台计算机到距离其最远......
  • Python小白进阶篇之概率论
        今天我们的学习笔记到了概率论这一篇,相信各位对于概率都不会太陌生,在高中作为选择题和大题,大家与之接触的不算少,那么走近属于大学的概率,战友们也一举拿下!!!一、事件概率1.1事件事件是指在某个试验或观察中可能发生的结果或结果的集合。是样本空间的一个子集,可以包......
  • 面向对象进阶-认识多态
    2024-10-10,今天的课程比较多,改了很多线下的事情,今天先对多态进行了认识。什么是多态?同类型的对象,表现出的不同形态。多态的表现形式?父类类型对象的名称=new子类对象();fuf=newzi();多态的前提?1.有继承关系 2.有父类引用指向子类对象 3.有方法重写多态的好......
  • 昇思MindSpore进阶教程--自动数据增强
    大家好,我是刘明,明志科技创始人,华为昇思MindSpore布道师。技术上主攻前端开发、鸿蒙开发和AI算法研究。努力为大家带来持续的技术分享,如果你也喜欢我的文章,就点个关注吧正文开始MindSpore除了可以让用户自定义数据增强的使用,还提供了一种自动数据增强方式,可以基于特定......
  • Vulkan进阶系列0 - Raytracing 基础
    一:概述    Vulkan的光线追踪是一种现代图形技术,用于实现更加逼真的高质量渲染效果。通过使用Vulkan的光线追踪扩展:VK_KHR_ray_tracing_pipeline和VK_KHR_acceleration_structure,程序员可以更加高效的模拟光线的传播,反射和折射,并能够跟踪光线在场景中的传播路径,计......
  • python爬虫 - 进阶requests模块
      ......
  • Python Kivy 应用的进阶学习教程
    文章目录Kivy应用的进阶学习教程目录1.使用Buildozer打包Android应用1.1环境准备1.2创建基本Kivy应用1.3安装和配置Buildozer1.4打包Android应用1.5部署到Android设备2.打包iOS应用的基本步骤2.1MacOS开发环境2.2使用Xcode和Kivy2.3打包iO......
  • Scala函数进阶
    (一)函数的字面量用语法1,语法为:(参数列表)=>{方法体}2,函数的字面量作用由于scala的函数字面量没有定义函数名,所以可以通过变量进行调用。另外,也可以通过参数的方式进行调用,关于这种方式的介绍将在scala的函数高阶中进一步说明,这里不在展开叙述。3,scala的函数字面简化第一......
  • Cesium进阶学习一、Primitive
    一、primitive简介 1、概念:[Primitive](https://cesium.com/learn/cesiumjs/ref-doc/Primitive.html)是Cesium中用于绘制几何图形的另一个重要的接口,相对于[Entity](https://cesium.com/learn/cesiumjs/ref-doc/Primitive.html)来说,它更接近渲染引擎底层,主要面向图形开发......