2258 2023. 01. 06 11:34:11 sztomi Tom és Jerry 3 cpp11 Elfogadva 50/50 90ms 9872 KiB
#include <bits/stdc++.h>

using namespace std;

typedef pair<int, int> pii;
int n, k;
vector<vector<int>> graf;
vector<int> tom_tav;
vector<int> jerry_tav;

void tavot_allit(int akt, int elozo, vector<int>& tavok){
    for(int kov : graf[akt]){
        if(kov == elozo) continue;
        tavok[kov] = tavok[akt] + 1;
        tavot_allit(kov, akt, tavok);
    }
}

pii legtavolabbi(int kezd){
    vector<bool> volt(n+1, false);
    queue<int> q;
    q.push(kezd);
    int akt_szint = 1, kov_szint = 0, tav = 0;
    int akt;
    int legtavol = -1;
    while(!q.empty()){
        akt = q.front();
        volt[akt] = true;
        akt_szint--;
        legtavol = akt;
        q.pop();

        for(int kov : graf[akt]){
            if(volt[kov]) continue;
            q.push(kov);
            kov_szint++;
        }

        if(akt_szint == 0){
            swap(kov_szint, akt_szint);
            tav++;
        }
    }
    return {legtavol, tav-1};
}

void megold(){
    int tom_kezd, jerry_kezd;
    cin >> n >> tom_kezd >> jerry_kezd >> k;
    graf.assign(n+1, vector<int>());
    tom_tav.assign(n+1, -1);
    jerry_tav.assign(n+1, -1);
    int a, b;
    for(int i = 0; i < n-1; i++){
        cin >> a >> b;
        graf[a].push_back(b);
        graf[b].push_back(a);
    }
    tom_tav[tom_kezd] = 0;
    tavot_allit(tom_kezd, -1, tom_tav);
    jerry_tav[jerry_kezd] = 0;
    tavot_allit(jerry_kezd, -1, jerry_tav);

    // ha Tom rogton kezdes utan elkapja Jerryt
    if(tom_tav[jerry_kezd] <= 1){
        cout << "IGEN\n";
        return;
    }
    if(2*k+1 > n-1){
        cout << "IGEN\n";
        return;
    }

    pii veg1 = legtavolabbi(1);
    pii veg2 = legtavolabbi(veg1.first);

    int leghosszabb = veg2.second;
    if(leghosszabb < 2*k+1){
        cout << "IGEN\n";
        return;
    }

    bool tom_elkapja = true;
    for(int i = 1; i <= n; i++){
        if(tom_tav[i]-1 <= jerry_tav[i]) continue;
        if(tom_tav[i] > k){
            tom_elkapja = false;
            break;
        }
    }
    cout << (tom_elkapja ? "IGEN" : "NEM") << "\n";
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int t;
    cin >> t;
    while(t--){
        megold();
    }
}
Részfeladat Összpont Teszt Verdikt Idő Memória
base 50/50
1 Elfogadva 0/0 3ms 1824 KiB
2 Elfogadva 0/0 2ms 2020 KiB
3 Elfogadva 5/5 2ms 2348 KiB
4 Elfogadva 1/1 3ms 2500 KiB
5 Elfogadva 1/1 3ms 2612 KiB
6 Elfogadva 1/1 3ms 2820 KiB
7 Elfogadva 1/1 3ms 3032 KiB
8 Elfogadva 1/1 3ms 3116 KiB
9 Elfogadva 1/1 3ms 3236 KiB
10 Elfogadva 1/1 3ms 3316 KiB
11 Elfogadva 2/2 3ms 3304 KiB
12 Elfogadva 2/2 3ms 3432 KiB
13 Elfogadva 1/1 3ms 3640 KiB
14 Elfogadva 2/2 90ms 6468 KiB
15 Elfogadva 2/2 75ms 5040 KiB
16 Elfogadva 2/2 86ms 6604 KiB
17 Elfogadva 2/2 87ms 7976 KiB
18 Elfogadva 2/2 89ms 6752 KiB
19 Elfogadva 2/2 86ms 7084 KiB
20 Elfogadva 2/2 61ms 9872 KiB
21 Elfogadva 2/2 75ms 5732 KiB
22 Elfogadva 2/2 71ms 5968 KiB
23 Elfogadva 3/3 90ms 8300 KiB
24 Elfogadva 2/2 89ms 7004 KiB
25 Elfogadva 3/3 86ms 7136 KiB
26 Elfogadva 2/2 90ms 8840 KiB
27 Elfogadva 2/2 75ms 5780 KiB
28 Elfogadva 3/3 72ms 5836 KiB