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;
       }
}
原文地址:https://www.cnblogs.com/acmLLF/p/13443022.html