50pts,WA on #2,7,8,9,10
查看原帖
50pts,WA on #2,7,8,9,10
1305759
ssy666666楼主2024/11/19 16:00

code

#include<bits/stdc++.h>
using namespace std;

vector<int> dir[1505];

int s[1505];

long long dp[1505][3];

bool head[1505];

void dfs(int n)
{
	for(int i=0;i<dir[n].size();i++)
	{
		dfs(dir[n][i]);
	}
	if(dir[n].size()!=0)
	{
		bool t=0;
		long long mi=0x3F3F3F3F;
		long long cnt=0;
		for(int i=0;i<dir[n].size();i++)
		{
			if(dp[dir[n][i]][1]<=dp[dir[n][i]][0])
			{
				cnt+=dp[dir[n][i]][1];
				t=1;
			}
			else
			{
				cnt+=dp[dir[n][i]][0];
				if(dp[dir[n][i]][0]-dp[dir[n][i]][1]<mi)
				{
					mi=dp[dir[n][i]][0]-dp[dir[n][i]][1];
				}
			}
		}
		if(t==0)
		{
			cnt-=mi;
		}
		dp[n][0]=cnt;
	}
	else
	{
		dp[n][0]=0x3F3F3F3F;
	}
	dp[n][1]=s[n];
	for(int i=0;i<dir[n].size();i++)
	{
		if(dp[dir[n][i]][0]==0x3F3F3F3F)
			continue;
		dp[n][1]+=dp[dir[n][i]][2];
	}
	long long r1=0,r2=s[n];
	for(int i=0;i<dir[n].size();i++)
	{
		r1+=min(dp[dir[n][i]][0],dp[dir[n][i]][1]);
		r2+=dp[dir[n][i]][2];
	}
	dp[n][2]=min(r1,r2);
	return;
}

int main()
{
	int n;
	int t,m,p; 
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>t;
		cin>>s[t];
		cin>>m;
		for(int j=1;j<=m;j++)
		{
			cin>>p;
			dir[t].push_back(p);
			head[p]=1;
		}
	}
	int i;
	for(i=1;i<=n;i++)
	{
		if(!head[i])
			break;
	}
	memset(dp,0,sizeof(dp));
	dfs(i);
	cout<<min(dp[i][0],dp[i][1]);
	return 0;
}

2024/11/19 16:00
加载中...