502 流

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

/*
http://oj.daimayuan.top/course/5/problem/225
有一棵 n个节点的树,节点编号从 1到 n,树上的每条边都有流量限制。
令某一个节点为根节点,向这个节点灌水,最终从叶子节点流出的水量之和为这个节点的最大流量。
请求出每个节点的最大流量。

输入格式
第一行一个整数 n表示节点数。

接下来 n−1行,每行三个整数 x,y,z
表示 x号节点和 y号节点之间有一条流量限制为 z的边。

数据保证读入的是一棵树。

输出格式
输出共 n行,第 i 行一个整数表示 i 号节点的最大流量。

样例输入
5
1 2 3
1 5 1
2 3 2
2 4 2
样例输出
4
5
2
2
1
数据规模
对于所有数据,保证 2≤n≤105,1≤x,y≤n,1≤z≤109。


5
1 2 1
2 3 1
3 4 1
4 5 1


3
1 2 1
2 3 1

*/

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

using namespace std;

const int N = 100010;
int h[N], e[2 * N], ne[2*N],w[2*N], idx;
int n;
long long dp[N], v[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]; long long c = w[i];
		if (j == fa) continue;
		isleaf = false;
		up(j, u);
		dp[u] += min(c, dp[j]);
	}
	if (isleaf) {
		dp[u] = 0x3f3f3f3f3f3f3f3f;
	}
}

void down(int u, int fa) {
	for (int i = h[u]; i != -1; i = ne[i]) {
		int j = e[i]; long long 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);
	}
}

 
int main()
{
	memset(h,-1,sizeof h);
	cin >> n;
	for (int i = 1; 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);

	for (int i = 1; i <= n; i++) {
		if (dp[i] != 0x3f3f3f3f3f3f3f3f)
			cout << v[i] + dp[i] << endl;
		else
			cout << v[i] << endl;
	}

	return 0;
}

posted on   itdef  阅读(4)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2020-10-10 LeetCode 142. 环形链表 II 链表遍历 哈希
2017-10-10 How-to Install VMware Tools on Debian Stretch 9 32/64bit Linux+GNU

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示