皇宫看守(树形dp)

#include
#include
#include
using namespace std;

int n,head[2005],dp[2005][3],fa[2005],w[2005],cnt;

struct edge{
    int v,next;
}e[2005];

inline void add(int u,int v){
    e[++cnt].v=v;
    e[cnt].next=head[u];
    head[u]=cnt;
}

inline int root(int v){
    if(fa[v]==-1)return v;
    return root(fa[v]);
}

//0:自无,父有 1:自有 2:自无父无,子有的有 
inline void guess(int u){
    int minn=2147483647,k=0;
    for(int i=head[u];i!=-1;i=e[i].next){
        int v=e[i].v;
        guess(v);
        dp[u][1]+=min(dp[v][0],dp[v][1]);
        dp[u][0]+=min(dp[v][1],dp[v][2]);
        if(dp[v][1]

转载于:https://www.cnblogs.com/Y15BeTa/p/11269059.html

你可能感兴趣的:(皇宫看守(树形dp))