44分部分分1树形DP过不去求调
查看原帖
44分部分分1树形DP过不去求调
333800
qip101楼主2022/11/21 23:30
#include <bits/stdc++.h>
#define MAXN 100100
#define MAXM 2002
#define INF 0x3f3f3f3f
using namespace std;
int n,m,p[MAXN],f[MAXN][2];
string type;
bool vis[MAXM][MAXM];
vector <int> G[MAXN];
void add(int u,int v)
{
	G[u].push_back(v);
	G[v].push_back(u);
	vis[u][v]=vis[v][u]=true;
}
void dp(int u)
{
	for(int i=0;i<G[u].size();i++)
	{
		int v=G[u][i];
		if(v==u)
			continue;
		dp(v);
		f[u][1]+=min(f[v][1],f[v][0])+p[i];
		f[u][0]+=f[v][1];
	}
}
int main()
{
	scanf("%d%d",&n,&m);
	cin >> type;
	for(int i=1;i<=n;i++)
		scanf("%d",p[i]);
	for(int i=1;i<=n-1;i++)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		add(u,v);
	}
	while(m--)
	{
		memset(f,0,sizeof(f));
		int a,x,b,y;
		scanf("%d%d%d%d",&a,&x,&b,&y);
		if(vis[a][b]==true && x==0 && y==0)
			puts("-1 ");
		else
		{
			int ans=0;
			dp(1);
			if(x==0)
				p[a]=INF;
			if(x==1)
				p[a]=0;
			if(y==0)
				p[b]=INF;
			if(y==1)
				p[b]=0;
			ans=max(f[1][1],f[1][0]);
			printf("%d ",ans);
		}
	}
	return 0;
}
2022/11/21 23:30
加载中...