• 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;
           }
    }
  • 相关阅读:
    python中读取文件数据时要注意文件路径
    sklearn.model_selection 的 train_test_split作用
    matplotlib中subplot的各参数的作用
    用梯度下降算法求最值
    AfxMessageBox与MessageBox用法与区别
    MFC、API、C++三者的区别
    2、CString与string借助char *互转
    1、创建MFC应用程序——单个文档
    1、Mat类的属性、方法
    CMake编译OpenCV
  • 原文地址:https://www.cnblogs.com/acmLLF/p/13443022.html
Copyright © 2020-2023  润新知