宫殿间可以相互看见,在看守全部宫殿的前提下,使花费的经费最少。
f [ i ] [ 0 ] 表 示 i 节 点 在 父 节 点 可 看 到 时 , 以 i 为 根 的 子 树 需 要 安 排 的 最 少 士 兵 数 f[i][0]表示i节点在父节点可看到时,以i为根的子树需要安排的最少士兵数 f[i][0]表示i节点在父节点可看到时,以i为根的子树需要安排的最少士兵数
f [ i ] [ 1 ] 表 示 i 节 点 在 子 节 点 可 看 到 时 , 以 i 为 根 的 子 树 需 要 安 排 的 最 少 士 兵 数 f[i][1]表示i节点在子节点可看到时,以i为根的子树需要安排的最少士兵数 f[i][1]表示i节点在子节点可看到时,以i为根的子树需要安排的最少士兵数
f [ i ] [ 2 ] 表 示 i 节 点 安 装 士 兵 时 , 以 i 为 根 的 子 树 需 要 安 排 的 最 少 士 兵 数 f[i][2]表示i节点安装士兵时,以i为根的子树需要安排的最少士兵数 f[i][2]表示i节点安装士兵时,以i为根的子树需要安排的最少士兵数
f [ i ] [ 0 ] = m i n ( f [ s o n ] [ 1 ] , f [ s o n ] [ 2 ] ) , f [ i ] [ 1 ] = m i n ( f [ s o n ] [ 1 ] , f [ s o n ] [ 2 ] ) + d f[i][0]=min(f[son][1],f[son][2]),f[i][1]=min(f[son][1],f[son][2])+d f[i][0]=min(f[son][1],f[son][2]),f[i][1]=min(f[son][1],f[son][2])+d
f [ i ] [ 2 ] = m i n ( f [ s o n ] [ 0 ] , f [ s o n ] [ 1 ] , f [ s o n ] [ 2 ] ) + c o s t [ i ] f[i][2]=min(f[son][0],f[son][1],f[son][2])+cost[i] f[i][2]=min(f[son][0],f[son][1],f[son][2])+cost[i]
d = m i n ( f [ s o n ] [ 2 ] − m i n ( f [ s o n ] [ 1 ] , f [ s o n ] [ 2 ] ) ) d=min(f[son][2]-min(f[son][1],f[son][2])) d=min(f[son][2]−min(f[son][1],f[son][2]))
#include
#include
using namespace std;
struct node{int y,next;}e[4001]; int ls[1501]; bool v[1501];
int n,k,f[1501][3],m,root,x,y,cost[1501];
int in(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans;
}
int min(int a,int b){return (a<b)?a:b;}
void dp(int x,int last){
int d=1e7;
for (int i=ls[x];i;i=e[i].next){
if (e[i].y==last) continue;//不退回去
dp(e[i].y,x);
f[x][0]+=min(f[e[i].y][1],f[e[i].y][2]);
f[x][1]+=min(f[e[i].y][1],f[e[i].y][2]);
d=min(d,f[e[i].y][2]-min(f[e[i].y][2],f[e[i].y][1]));
f[x][2]+=min(f[e[i].y][2],min(f[e[i].y][0],f[e[i].y][1]));
}
f[x][1]+=d; f[x][2]+=cost[x];
}
int main(){
freopen("guard.in","r",stdin);
freopen("guard.out","w",stdout);
n=in();
for (int i=1;i<=n;i++){
x=in(); cost[x]=in(); k=in();
while (k--) e[++m]=(node){y=in(),ls[x]},ls[x]=m,v[y]=1;
}
for (root=1;root<=n&&v[root];root++);
dp(root,0); return !printf("%d",min(f[root][1],f[root][2]));
}