#include<bits/stdc++.h>
using namespace std;
inline int read(){
int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
return s*w;
}
const int N=1505;
int val[N],bj[N],f[N][3];
int tot,head[N],nxt[N],to[N];
inline void add(int x,int y){nxt[++tot]=head[x];head[x]=tot;to[tot]=y;}
inline void DP(int x,int fa){
int d=1e9;
for(int i=head[x];i;i=nxt[i]){
int y=to[i];
if(y==fa)continue;
DP(y,x);
f[x][0]+=min(f[y][1],f[y][2]);
f[x][1]+=min(f[y][1],f[y][2]);
f[x][2]+=min(f[y][0],min(f[y][1],f[y][2]));
d=min(d,f[y][2]-min(f[y][2],f[y][1]));
}
f[x][1]+=d;f[x][2]+=val[x];
}
int main(){
int n=read();
for(int i=1,x,num;i<=n;i++){
x=read();val[x]=read();num=read();
for(int j=1,y;j<=num;j++){
y=read();add(x,y);bj[y]=1;
}
}
int root=1;while(bj[root])root++;
DP(root,0);
printf("%d\n",min(f[root][1],f[root][2]));
return 0;
}
原文:https://www.cnblogs.com/PPXppx/p/11004183.html