[SDOI2006]保安站岗 (洛谷p2458)(树形DP)

题目地址
配套博客

[USACO08JAN]Cell Phone Network G 一样,只是每个节点的权值不一样。

#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;

const int INF = 0x3f3f3f3f;
const double eps = 1e-5;
const int N = 2e4 + 10;
const int mod = 10007;

int dp[N][3],w[N];
int ne[N],e[N],h[N],idx=1;

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

void dfs(int u,int fa){
	dp[u][0] = w[u];
	int mi = 1e9;
	for(int i=h[u];i;i=ne[i]){
		int j = e[i];
		if(j == fa) continue;
		dfs(j,u);
		dp[u][0] += min(min(dp[j][0],dp[j][1]),dp[j][2]);
		dp[u][2] += min(dp[j][0],dp[j][1]);
		if(dp[j][0] - min(dp[j][0],dp[j][1]) < mi) mi = dp[j][0] - min(dp[j][0],dp[j][1]);
	}
	dp[u][1] = mi + dp[u][2];
}

signed main(){
	IOS
    int n; cin>>n;
    for(int i=1;i<=n;i++){
    	int a; cin>>a;
    	cin>>w[a];
    	int k; cin>>k;
    	for(int j=1;j<=k;j++){
    		int b; cin>>b;
    		add(a,b);add(b,a);
		}
	}
    dfs(1,0);
    cout<<min(dp[1][0],dp[1][1])<<endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值