fzu2157(树形dp)
2024-08-25 19:17:43
http://acm.fzu.edu.cn/problem.php?pid=2157
这是一道很水的树形dp吧,本来不想写它的题解的,不过比赛的时候,队友说要我做这个题目,但是由于我感觉另一个题目可以出,而放弃做这个题目.....本来可以多出一道的,结果......以后的比赛中,还是得多多注意这个方面的问题。
题意:给出n个点,每个点都有两种花费,一个是0种花费,一个是1种花费,每两个点相连,边也有花费,是随着点所取话费的种类不同,边的花费也不同,边有四种花费,00,01,10,11 问建成整颗树所需要的最少花费。
思路:dp[i][0]代表当前结点取0种花费时建好以i结点为根节点的最少花费,dp[i][1]代表当前结点取1种花费时建好以i结点为根节点的最少花费,那么有动态转移方程就出来了.......
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
#define inf (1<<28)
struct node
{
int k;
int a,b,c,d;
};
int s[200005][2],dp[200005][2];
int t[200005][2][2],n;
vector<node>vet[200005]; void dfs(int root)
{
if(vet[root].size()==0)
{
dp[root][0]=s[root][0];
dp[root][1]=s[root][1];
return;
}
dp[root][0]=s[root][0];
dp[root][1]=s[root][1];
for(int i=0;i<vet[root].size();i++)
{
node p=vet[root][i];
dfs(p.k);
dp[root][0]+=min(dp[p.k][0]+p.a,dp[p.k][1]+p.b);
dp[root][1]+=min(dp[p.k][0]+p.c,dp[p.k][1]+p.d);
}
}
int main()
{
int text;
scanf("%d",&text);
while(text--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&s[i][0]);
for(int i=1;i<=n;i++)
scanf("%d",&s[i][1]); for(int i=0;i<=n;i++)
{
vet[i].clear();
dp[i][0]=dp[i][1]=0;
} for(int i=0;i<n-1;i++)
{
int x,y,a,b,c,d;
scanf("%d%d%d%d%d%d",&x,&y,&a,&b,&c,&d);
node p;
p.k=y;
p.a=a;
p.b=b;
p.c=c;
p.d=d;
vet[x].push_back(p);
//t[i][0][0]=a;
//t[i][0][1]=b;
//t[i][1][0]=c;
//t[i][1][1]=d;
}
dfs(1);
printf("%d\n",min(dp[1][0],dp[1][1]));
}
return 0;
}
最新文章
- Apache Spark简单介绍、安装及使用
- 2.快速部署MySQL主从复制
- WUI 前端组件
- java变量的初始化
- Redis的Python客户端redis-py
- MySQL 批量插入 Update时Replace
- 1032 - A-B 组合数学
- Python: 收集所有命名参数
- 推些C语言与算法书籍
- Java设计模式-抽象工厂模式(Abstract Factory )
- C++多态的实现及原理详细解析
- ocp 1Z0-047 1-60题解析
- 【弱省胡策】Round #5 Construct 解题报告
- HTML控件ID和NAME属性的区别,以及如何在asp.net页面的.CS文件中获得.ASPX页面中HTML控件的值
- POJ-3261-Milk Patterns(后缀数组)
- 修改document.domain的注意事项(转)
- Nio经典工作方式
- 自动化测试-Selenium家谱介绍
- vue插件移动框
- 根据 Power BI Desktop(预览版)中的报表页创建工具提示