从P2899过来的,样例不过,50pts
#include <iostream>
#include <vector>
using namespace std;
const int N=1e4+10,MAX=0x3f3f3f3f;
int n,dp[N][3],k[N];
vector<int> g[N];
struct node{
int w,id;
};
void dfs(int u,int fa){
node maxn;
maxn.w=MAX,maxn.id=0;
bool b=1,tt=1;
dp[u][0]=0,dp[u][2]=0;
for(auto v:g[u]){
if(v==fa) continue;
tt=0;
dfs(v,u);
if(dp[v][1]<maxn.w) maxn.w=dp[v][1],maxn.id=v;
if(dp[v][1]<=dp[v][0]) b=0;
dp[u][0]+=min(dp[v][1],dp[v][0]);
dp[u][1]+=min(dp[v][0],min(dp[v][1],dp[v][2]));
dp[u][2]+=min(dp[v][0],dp[v][1]);
}if(tt) dp[u][0]=MAX;
else if(b&&maxn.id!=0){
dp[u][0]-=dp[maxn.id][0];
dp[u][0]+=dp[maxn.id][1];
}return ;
}
int main(){
cin>>n;
int a,b,c;
for(int i=1;i<=n;i++){
cin>>a>>dp[a][1]>>b;
while(b--){
cin>>c;
g[a].push_back(c);
g[c].push_back(a);
}
}dfs(1,0);
cout<<min(dp[1][0],dp[1][1]);
return 0;
}
```cpp