CF#660 C - Uncle Bogdan and Country Happiness

8420 ワード

标题:n都市(1は首都)、n-1道路が連なっています.m人の市民は良い気持ちと悪い気持ちを持っている.市民はそれぞれの都市に住んでいて、首都で働いていて、退勤して家に帰るときは気持ちが悪くなりますが、悪い気持ちはよくなく、都市の中では気持ちが変わりません.幸福指数f[x]は都市xを通るすべての人の中で良い気持ちの人数-悪い気持ちの人数である.
要求、幸福指数の測量器は正確に“YES”を出力することを測量して、さもなくば“NO”を出力します
入力:
最初の行には、整数T(1≦t≦10000)が含まれています.テスト例の数です.各試験例の第1行は、2つの整数nおよびm(1≦n≦105;0≦m≦109)--都市および市民の数を含む.各試験例の2行目はn整数p 1,p 2,...,を含む.pn(0≦pi≦m;p 1+p 2+…)+pn=MP 1+p 2+…+pn=m)のうち、pipiは第2都市に居住する人数である.3行目はnn個の整数h 1,h 2,....hh 1,h 2,...,HN(−109≦hi≦109−109≦hi≦109)は,hiがi番目の都市の計算幸福指数である.次にn−1行は、道路の説明を含み、各行に1本である.各線は、xiとyi(1≦xi,yi≦n;xi≠yi)の2つの整数を含み、xiとyiはi番目の道路で接続された都市である.すべての試験例からのnの和が2⋅105を超えないことを保証する.
サンプルを入力:

2
7 4 1 0 1 1 0 1 0 4 0 0 -1 0 -1 0 1 2 1 3 1 4 3 5 3 6 3 7 5 11 1 2 5 2 1 -11 -2 -6 -2 -1 1 2 1 3 1 4 3 5



2
4 4
1 1 1 1
4 1 -3 -1
1 2
1 3
1 4
3 13
3 3 7
13 1 4
1 2
1 3
 

出力:
各試験例について、収集したデータが正しい場合は「YES」を印刷する.そうでなければ、「NO」の文字.
出力サンプル:

YES YES


NO
NO
 

問題:
dfs
都市xに住む人はp[x]個,計測器指数はh[x]であり,この都市を通る総数はa[x]である.気持ちの良い人はgood[x]人がいて、気持ちの悪い人はbad[x]人がいます
したがって、a[x]=good[x]+bad[x],h[x]=good[x]-bad[x]
3つの制約があります.
1.a[x]+h[x]は2で割り切れる.
2.good[x]の区間範囲は[0,a[x]];
3.親ノード都市の気分が良い人は子ノード都市の気分が良い人より大きい(この都市を通ると気分が悪くなるかもしれないが、良くならない)
コード:
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

const int maxn = 1e6 + 5;
int p[maxn], h[maxn], a[maxn], b[maxn];//a[x]     x    ,b[x]     x      ,h[x]     x         
bool flag = true;
vector<int>g[maxn];

void dfs(int x, int fa) {
    a[x] = p[x];
    int sum_b = 0;
    for (int i = 0; i < g[x].size(); i++) {
        int v = g[x][i];
        if (v == fa)continue;
        dfs(v, x);
        a[x] += a[v];
        sum_b += b[v];
    }
    if ((a[x] + h[x]) % 2)flag = false;
    b[x] = (a[x] + h[x]) / 2;
    if (b[x]<0 || b[x]>a[x])flag = false;
    if (sum_b > b[x])flag = false;

}

int main() {
    int t;
    cin >> t;
    while (t--) {
        int n, m;
        cin >> n >> m;
        for (int i = 1; i <= n; i++)g[i].clear();
        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;
            g[x].push_back(y);
            g[y].push_back(x);
        }
        flag = true;
        dfs(1, -1);
        if (flag)cout << "YES" << endl;
        else cout << "NO" << endl;
    }
    return 0;
}