22582023-01-06 11:34:11sztomiTom és Jerry 3cpp11Elfogadva 50/5090ms9872 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ÖsszpontTesztVerdiktIdőMemória
base50/50
1Elfogadva0/03ms1824 KiB
2Elfogadva0/02ms2020 KiB
3Elfogadva5/52ms2348 KiB
4Elfogadva1/13ms2500 KiB
5Elfogadva1/13ms2612 KiB
6Elfogadva1/13ms2820 KiB
7Elfogadva1/13ms3032 KiB
8Elfogadva1/13ms3116 KiB
9Elfogadva1/13ms3236 KiB
10Elfogadva1/13ms3316 KiB
11Elfogadva2/23ms3304 KiB
12Elfogadva2/23ms3432 KiB
13Elfogadva1/13ms3640 KiB
14Elfogadva2/290ms6468 KiB
15Elfogadva2/275ms5040 KiB
16Elfogadva2/286ms6604 KiB
17Elfogadva2/287ms7976 KiB
18Elfogadva2/289ms6752 KiB
19Elfogadva2/286ms7084 KiB
20Elfogadva2/261ms9872 KiB
21Elfogadva2/275ms5732 KiB
22Elfogadva2/271ms5968 KiB
23Elfogadva3/390ms8300 KiB
24Elfogadva2/289ms7004 KiB
25Elfogadva3/386ms7136 KiB
26Elfogadva2/290ms8840 KiB
27Elfogadva2/275ms5780 KiB
28Elfogadva3/372ms5836 KiB