首页 > 其他分享 >P3354 [IOI2005] Riv 河流

P3354 [IOI2005] Riv 河流

时间:2024-04-20 16:44:54浏览次数:22  
标签:P3354 cnt 伐木场 Riv IOI2005 st int 节点 dis

P3354 [IOI2005] Riv 河流

树形 dp

我们很容易套路地用 \(f_{u,i}\) 表示在 \(u\) 子树中,\(u\) 节点放了 \(i\) 个伐木场的最小花费。但是这样无法转移,原因是无法表示路径长度,也无法知道运送数量。

所以我们现在考虑增加状态,能够表示出距离。只考虑 \(u\) 节点的花费,其木头要运送上去,一定会走一段 \(u\) 到某个祖先的一段距离,如果这个祖先有伐木场,那么距离就是这段长度。于是设 \(f_{u,i,j}\) 表示 \(u\) 子树中放了 \(j\) 个伐木场,在祖先 \(i\) 上有一个伐木场的最小花费。此时因为转移时 \(u\) 子树内的节点已经计算过了,转移完只需要计算 \(u\) 节点的运送花费。

但是仔细一想还是不够,如果 \(u\) 节点有伐木场,那么在转移时 \(v\) 节点的距离就是 \(u\) 到 \(v\)。所以我们还需要加一维表示 \(u\) 建不建伐木场(或者开一个新数组)。

转移时细节的地方:我们在转移时可以先钦定 \(f\) 为 \(u\) 节点不建伐木场,\(g\) 为建伐木场,最后把 \(g\) 合并到 \(f\) 上即可。

复杂度 \(O(n^2k^2)\)。

#include <bits/stdc++.h>
#define pii std::pair<int, int>
#define fi first
#define se second
#define pb push_back

typedef long long i64;
const i64 iinf = 0x3f3f3f3f, linf = 0x3f3f3f3f3f3f3f3f;
const int N = 110;
int n, k, cnt;
struct node {
	int to, nxt, w;
} e[N];
int h[N], w[N];
void add(int u, int v, int w) {
	e[++cnt].to = v;
	e[cnt].nxt = h[u];
	e[cnt].w = w;
	h[u] = cnt;
}
int st[N], top;
int f[N][N][N], g[N][N][N], dis[N];
void dfs(int u) {
	st[++top] = u;
	for(int _ = h[u]; _; _ = e[_].nxt) {
		int v = e[_].to;
		dis[v] = dis[u] + e[_].w;
		dfs(v);
		for(int i = 1; i <= top; i++) {
			for(int j = k; j >= 0; j--) {
				f[u][st[i]][j] += f[v][st[i]][0];
				g[u][st[i]][j] += f[v][u][0]; //这里要先转移一次,否则无法正确转移
				for(int x = 1; x <= j; x++) {
					f[u][st[i]][j] = std::min(f[u][st[i]][j], f[u][st[i]][j - x] + f[v][st[i]][x]);
					g[u][st[i]][j] = std::min(g[u][st[i]][j], g[u][st[i]][j - x] + f[v][u][x]);
				}
			}	
		}
	}
	for(int i = 1; i <= top; i++) {
		for(int j = k; j >= 1; j--) {
			f[u][st[i]][j] = std::min(f[u][st[i]][j] + w[u] * (dis[u] - dis[st[i]]), g[u][st[i]][j - 1]);
		}
		f[u][st[i]][0] += w[u] * (dis[u] - dis[st[i]]);
	}
	top--;
}
void Solve() {
	std::cin >> n >> k;
	for(int i = 1; i <= n; i++) {
		int v, d;
		std::cin >> w[i] >> v >> d;
		add(v, i, d);
	}
	dfs(0);
	std::cout << f[0][0][k] << "\n";
}
int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
	Solve();

	return 0;
}

标签:P3354,cnt,伐木场,Riv,IOI2005,st,int,节点,dis
From: https://www.cnblogs.com/FireRaku/p/18147856

相关文章

  • 转载Using Domain-Driven Design(DDD)in Golang
    转载自:https://dev.to/stevensunflash/using-domain-driven-design-ddd-in-golang-3ee5UsingDomain-DrivenDesign(DDD)inGolang#go#ddd#redis#postgresDomain-DrivenDesignpatternisthetalkofthetowntoday.Domain-DrivenDesign(DDD)isanapproachtosoft......
  • 196. 删除重复的电子邮箱【Problem:Every derived table must have its own alias】
    SQL-Boy上线,最近在写SQL语句遇到了这样的问题。Problem:Everyderivedtablemusthaveitsownalias错误语句如下deletefromPersonwhereidnotin(selectidfrom(selectmin(id)asidfromPersongroupbyemail)......
  • NVIDIA驱动失效简单解决方案:NVIDIA-SMI has failed because it couldn‘t communicate
    NVIDIA驱动失效简单解决方案:NVIDIA-SMIhasfailedbecauseitcouldn‘tcommunicatewiththeNVIDIAdriver.问题:准备用GPU跑模型时,提示cuda不存在第一步,打开终端,输入:vidia-smi1|NVIDIA-SMIhasfailedbecauseitcouldn'tcommunicatewiththeNVIDIAdriver.2|Make......
  • [Testing adn BDD] Introduction to Test and Behavior Driven Development
    TheImportanceofTestingThevalueoftesting"Ifit'sworthbuilding,it'sworthtesting.Ifit;snotworthtesting,whyareyouwastingyourtimetoworkngonit?"--ScottAmbler,agiledate.orgDesignprinciplesforApolloUsea......
  • day12_我的Java学习笔记 (package包、权限修饰符_private+缺省+protected+public、fin
    1.包IDEA配置自动导包:2.权限修饰符同一个类中的,【private、缺省、protected、public】都可以访问同一个包中的其他类,【private】不可以访问,【缺省、protected、public】都可以访问不同包下的无关类,【private、缺省、protected】都不可以访问,只有【public......
  • selenium之webdriver介绍
    1、WebDriver工作原理例子:我们先从一个打车的例子,来理解下webdriver的工作原理,当我们打车时,会有3个角色:乘客:告诉出租车司机去哪里,大概怎么走​出租车司机:按照乘客的要求来操控出租车​出租车:出租车按照司机的操控完成......
  • ChromeDriver高版本下载
    chromedriver下载chromedriver114版本及以下的下载仓库地址:https://chromedriver.storage.googleapis.com/index.html chromedrvier从115版本开始从以前默认的仓库变成了新的地址发布:https://googlechromelabs.github.io/chrome-for-testing 新发布地址默认只列出......
  • docker 报错:不能选择设备驱动 could not select device driver 的解决方法(实测有效)
    Ubuntu安装完docker引擎后,在创建容器的时候指定 --gpusall,出现报错如下:报错: docker:Errorresponsefromdaemon:couldnotselectdevicedriver""withcapabilities:[[gpu]].解决该问题还需要安装Nvidia-docker,本篇参照Nvidia官网。NVIDIAContainerToolkit在许多......
  • Deep Learning with Differential Privacy
    差分隐私深度学习(CCS16'(CCFA))时隔半年重读这篇论文,终于懂了个七七八八,现在来做一下总结。摘要基于神经网络的机器学习技术在众多领域都取得了令人瞩目的成果。通常,模型的训练需要大量具有代表性的数据集,这些数据集可能是众包的,包含敏感信息。模型不应暴露这些数据集中的隐......
  • How to find which Azure Private DNS Zone is associated with VNet
    Herearesomecommonscenariosinquestion:AzFWgoesintofailedstateduetoaPrivateDNSzonelinkedwiththeVNETwhichcausesresolutionfailures.PrivateEndpointcreationwhereDNSzonefailstolinktothevnetasanotherzonewiththesamename......