挂了求调
查看原帖
挂了求调
735235
hmwzd1314楼主2024/7/9 23:15
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k[1509],dp[1509][2],ok[1509];
vector<int>e[1509];
struct node
{
	int v1,v2;	
};
void dfs(int x,int rt)
{
	int siz=e[x].size();
	if(siz==0)
	{
		dp[x][1]=k[x];
		dp[x][0]=0;
		return;
	}
	dp[x][1]=k[x];
	for(int i=0;i<siz;i++)
	{
		int v=e[x][i];
		if(v==rt)continue;
		dfs(v,x);
		dp[x][1]+=min(dp[v][1],dp[v][0]);
	}
	dp[x][0]=0x3f3f3f3f;
	int sb=0;
	for(int i=0;i<siz;i++)
	{
		int v=e[x][i];
		if(v==rt)continue;
		if(!ok[v])sb+=dp[v][1];
		else sb+=min(dp[v][1],dp[v][0]);
	}
	for(int i=0;i<siz;i++)
	{
		int v=e[x][i];
		if(v==rt)continue;
		if(ok[v])dp[x][0]=min(dp[x][0],dp[v][1]+sb-min(dp[v][1],dp[v][0]));
		else dp[x][0]=min(dp[x][0],sb);
	}
}
signed main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int x;
		cin>>x>>k[i]>>ok[i];
		for(int j=0;j<ok[i];j++)
		{
			int pos;
			cin>>pos;
			e[x].push_back(pos);
		}
	}
	dfs(1,0);
	for(int i=1;i<=n;i++)cout<<dp[i][0]<<" "<<dp[i][1]<<"\n";
	cout<<min(dp[1][1],dp[1][0]);
	return 0;
}

dp[i][0/1]表示第i个(不)选的最小值

2024/7/9 23:15
加载中...