求调
查看原帖
求调
1048875
GLY0912楼主2024/9/30 12:55

从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
2024/9/30 12:55
加载中...