點對最大值-----------------------------樹形dp

在這裏插入圖片描述
在這裏插入圖片描述
解析:
這道題相當於樹的最長路徑加強版.
f[i]:表示以i爲根的子樹,到達節點i的最大值是多少
初始化 f[i]=c[i];
狀態轉移方程:
f[u]=max(f[u],f[v]+w[i])
解釋:當前u節點的最大值,有可能就是自身,有可能是子節點+邊權。所以兩者取較大者即可

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int e[N<<2],ne[N<<2],w[N<<2],h[N<<2],idx;
int t,n,ans;
int f[N];
void add(int a,int b,int c)
{
	e[idx]=b;w[idx]=c;ne[idx]=h[a];h[a]=idx++;
}
void dfs(int u,int fa)
{
	for(int i=h[u];~i;i=ne[i])
	{
		int v=e[i];
		if(v==fa) continue;
		dfs(v,u);
		ans=max(ans,f[u]+f[v]+w[i]);
	//	cout<<ans<<endl;
		f[u]=max(f[u],f[v]+w[i]);
	}
}
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		idx=0;
		memset(h,-1,sizeof h);
		ans=-0x3f3f3f3f;
		for(int i=2,u,c;i<=n;i++)
		{
			scanf("%d %d",&u,&c);
			add(u,i,c);
			add(i,u,c);
		}
		for(int i=1;i<=n;i++) scanf("%d",&f[i]); 
		dfs(1,-1);
		cout<<ans<<endl;
	}
	return 0;
	
	
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章