当前位置: 代码迷 >> 综合 >> C. Uncle Bogdan and Country Happiness(DFS)
  详细解决方案

C. Uncle Bogdan and Country Happiness(DFS)

热度:62   发布时间:2024-02-04 11:16:15.0

C. Uncle Bogdan and Country Happiness(DFS)

思路: d f s dfs

设经过城市 i i 的好人为: g [ i ] g[i] ,拜访城市 i i 的总人数为: a [ i ] a[i]
主要是找到 g [ i ] g[i] 的表达式,这题就解决了。
根据: g [ i ] ? ( a [ i ] ? g [ i ] ) = h [ i ] g [ i ] = a [ i ] + h [ i ] 2 g[i]-(a[i]-g[i])=h[i]\rightarrow g[i]=\dfrac{a[i]+h[i]}{2}

找到三个限制条件:

1: 2 2 能整除 a [ i ] + h [ i ] a[i]+h[i]

2: g [ i ] [ 0 , a [ i ] ] g[i]\in[0,a[i]]

3: g [ i ] v s o n g [ v ] g[i]\geq \sum\limits_{v\in{son}} g[v]

然后跑 d f s dfs

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a) memset(a,0,sizeof a)
#define reg register
#define pb push_back
#define over {ok=0;return;}
int n,t,m,h[N],p[N],a[N],g[N];
bool ok;
vector<int>e[N];
void dfs(int u,int fa){a[u]=p[u];int sum=0;for(auto v:e[u]){if(v==fa) continue;dfs(v,u);sum+=g[v];a[u]+=a[v];}if((a[u]+h[u])&1) over;g[u]=(a[u]+h[u])>>1;if(!(g[u]>=0&&g[u]<=a[u])) over;if(sum>g[u]) over;  
}
int main(){int t;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);ok=1;for(reg int i=1;i<=n;i++) scanf("%d",&p[i]);for(reg int i=1;i<=n;i++) scanf("%d",&h[i]);for(int i=1,u,v;i<n;i++)scanf("%d%d",&u,&v),e[u].pb(v),e[v].pb(u);dfs(1,0);puts(ok?"YES":"NO");for(int i=1;i<=n;i++) e[i].clear();}return 0;
}
  相关解决方案