P11249 [GESP202409 七级] 小杨寻宝 题解
提供一种没有在题解区出现的解题思路。
使用树形 dp。
设
那么状态转移是
假设
记得清空!!!
代码(有注释):
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
int a[N];
vector<int>e[N];
int f[N];
int maxx;
void dfs(int x,int fa)
{
f[x] = a[x];
int maxxx = 0;
int ans = 0;
for(int i = 0;i<e[x].size();i++)
{
int v = e[x][i];
if(v!=fa)
{
dfs(v,x);
if(ans<f[v])//求最大的
{
ans = f[v];
maxxx = v;
}
f[x] = max(f[x],f[v]+a[x]);
}
}
int maxxxx = 0;
int ans1 = 0;
for(int i = 0;i<e[x].size();i++)
{
int v = e[x][i];
if(v!=fa)
{
if(ans1<f[v]&&v!=maxxx)//求第二大的
{
ans1 = f[v];
maxxxx = v;
}
}
}
maxx = max(maxx,max(f[x],ans+ans1+a[x]));
}
int main()
{
int _;
scanf("%d",&_);
while(_--)
{
memset(f,0,sizeof(f));//记得清空!!!
int num = 0;
int flag = 0;
int n;
scanf("%d",&n);
for(int i = 1;i<=n;i++)
{
e[i].clear();//这里也清空哦,很容易漏!!
scanf("%d",&a[i]);
if(a[i])
{
num++;
}
}
for(int i = 1;i<n;i++)
{
int x,y;
scanf("%d %d",&x,&y);
e[x].push_back(y);
e[y].push_back(x);
}
maxx = 0;//这里也得重置
dfs(1,0);
printf("%s\n",maxx>=num?"Yes":"No");
}
return 0;
}