1. 程式人生 > 實用技巧 >Codeforces Round #660 (Div. 2) C. Uncle Bogdan and Country Happiness

Codeforces Round #660 (Div. 2) C. Uncle Bogdan and Country Happiness

連結 :http://codeforces.com/contest/1388/problem/C

題意: 有若干個人,樹根為1,從根開始往下走,心情可能會變壞,壞心情不可能變好,

每個城市有個happyness值,問你這個圖成不成立,

題解 :dfs樹一下,因為dfs樹是從下向上回溯,所以反過來,考慮好心情不能變壞即可,

同時手玩一下奇數偶數的問題就可以了。

#include<bits/stdc++.h>
#define pb push_back
#define fi first
#define se second
#define io std::ios::sync_with_stdio(false)
using
namespace std; typedef long long ll; typedef pair<int,int> pii; const int P = 1e9+7, INF = 0x3f3f3f3f; const int maxn=1e5+10; std::vector<int> a[maxn]; int h[maxn]; int p[maxn]; int b[maxn]; int siz[maxn]; int flag; void dfss(int u,int fa=0) { siz[u]=p[u]; for(int i=0;i<a[u].size();i++) {
int v=a[u][i]; if(v==fa) continue; dfss(v,u); siz[u]+=siz[v]; b[u]+=b[v]; } if(abs(h[u])%2!=siz[u]%2) flag=1; if(abs(h[u])>siz[u]) flag=1; int x=(h[u]+siz[u])/2; if(b[u]>x) flag=1; b[u]=x; }
/*void dfs(int u,int fa=0) { for(int i=0;i<a[u].size();i++) { int v=a[u][i]; if(v==fa) continue; dfs(v,u); } } */ int main() { io; int n,m; int t; cin>>t; while(t--) { cin>>n>>m; for(int i=1;i<=n;i++) { a[i].clear(); siz[i]=0; b[i]=0; } flag=0; for(int i=1;i<=n;i++) cin>>p[i]; for(int i=1;i<=n;i++) cin>>h[i]; for(int i=1;i<n;i++) { int x,y; cin>>x>>y; a[x].push_back(y); a[y].push_back(x); } // dfss(1); dfss(1); if(flag) cout<<"NO"<<endl; else cout<<"YES"<<endl; } }