• JLOI/SHOI2016侦查守卫


    树形DP,较复杂


    SOL:

    (f[i][j]i)点向上(j)层都可以被监视最小代价(当前点为第0层)

    (g[i][j]i)点向下(j)层都无法别监视最小代价(当前点为第1层)

    初始值:

    需守卫的点:(f[x][0]=g[x][0]=w[x])

    其余点:(f[x][0]=g[x][0]=0)

    所有点:(f[x][i]=w[x](i>0))

    转移方程:

    [f[x][i]=min(f[x][i]+min(g[v][i],f[v][i+1]),g[x][i+1]+f[v][i+1]) ]

    [f[x][i]=min(f[x][i],f[x][i+1]) ]

    [g[x][0]=f[x][0] ]

    [g[x][i]+=g[v][i-1] ]

    [g[x][i]=min(g[x][i],g[x][i-1]) ]

    #include<bits/stdc++.h>
    using namespace std;
    inline int read(){
    	int x=0,f=1;char c=getchar();
    	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
    	while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
    	return f==1?x:-x;
    }
    const int N=5e5+4,D=24;
    int n,m,d,a[N],f[N][D],g[N][D],w[N];
    vector<int>e[N];
    void dfs(int x,int fa){
    	if(a[x])f[x][0]=g[x][0]=w[x];
    	else f[x][0]=g[x][0]=0;
    	for(int i=1;i<=d;i++)f[x][i]=w[x];
    	for(auto v:e[x]){
    		if(v==fa)continue;
    		dfs(v,x);
    		for(int i=d;i>=0;i--){
    			f[x][i]=min(min(f[x][i]+g[v][i],g[x][i+1]+f[v][i+1]),f[x][i]+f[v][i+1]);
    			f[x][i]=min(f[x][i+1],f[x][i]);
    		}
    		g[x][0]=f[x][0];
    		for(int i=1;i<=d+1;i++){
    			g[x][i]=g[x][i]+g[v][i-1];
    			g[x][i]=min(g[x][i],g[x][i-1]);
    		}
    	}
    }
    int main(){
    	n=read();d=read();
    	for(int i=1;i<=n;i++)w[i]=read();
    	m=read();
    	for(int i=1;i<=m;i++)a[read()]=1;
    	for(int i=1,u,v;i<n;i++){
    		u=read();v=read();
    		e[u].push_back(v);e[v].push_back(u);
    	}
    	memset(f,0x3f,sizeof(f));
    	dfs(1,0);
    	cout<<f[1][0];
    	return (0-0);
    }
    
  • 相关阅读:
    spring下配置shiro
    web.xml文件配置说明
    spring中配置缓存—ehcache
    applicationContext.xml配置简介
    spring task定时器的配置使用
    spring配置数据库连接池druid
    Mybatis使用pageHelper步骤
    mybatis-generator和TKmybatis的结合使用
    PHP删除一个目录下的所有文件,不删除文件夹
    nodejs学习
  • 原文地址:https://www.cnblogs.com/aurora2004/p/12535683.html
Copyright © 2020-2023  润新知