2390 2023. 01. 12 13:34:13 sztomi Tom és Jerry2 (60) cpp11 Időlimit túllépés 2/60 500ms 11640 KiB
#include <bits/stdc++.h>

using namespace std;

const int INF = 1e9+7;

vector<int> tavok(int start, vector<vector<int>>& graf, int n){
    vector<int> ki(n+1, INF);
    vector<bool> volt(n+1, false);
    queue<int> q;
    q.push(start);
    volt[start] = true;
    int akt, akt_meret = 1, kov_meret = 0, tav = 0;
    while(!q.empty()){
        akt = q.front();
        akt_meret--;
        ki[akt] = tav;
        q.pop();

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

        if(akt_meret == 0){
            swap(akt_meret, kov_meret);
            tav++;
        }
    }

    return ki;
}

void dfs(int akt, int szulo, int& ido, vector<vector<int>>& graf, vector<int>& be_ido, vector<int>& kis, vector<bool>& volt, vector<bool>& vago){
    be_ido[akt] = kis[akt] = ido++;
    volt[akt] = true;

    int gyerek_db = 0;
    for(int kov : graf[akt]){
        if(kov == szulo) continue;
        if(volt[kov]){
            kis[akt] = min(kis[akt], be_ido[kov]);
        }
        else{
            dfs(kov, akt, ido, graf, be_ido, kis, volt, vago);
            gyerek_db++;
            kis[akt] = min(kis[akt], kis[kov]);

            if(be_ido[akt] <= kis[kov]){
                vago[akt] = true;
            }
        }
    }
    if(szulo == -1 && gyerek_db == 1){
        vago[akt] = true;
    }
}


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

    int n, m, t, j_db, lyuk;
    cin >> n >> m >> t >> j_db >> lyuk;
    vector<vector<int>> tom_graf(n+1, vector<int>());
    vector<vector<int>> jerry_graf(n+1, vector<int>());

    int a, b, c;
    for(int i = 0; i < m; i++){
        cin >> a >> b >> c;
        jerry_graf[a].push_back(b);
        jerry_graf[b].push_back(a);
        if(c == 2){
            tom_graf[a].push_back(b);
            tom_graf[b].push_back(a);
        }
    }

    int ido = 0;
    vector<int> be_ido(n+1, INF);
    vector<int> kis(n+1, INF);
    vector<bool> volt(n+1, false);
    vector<bool> vago(n+1, false);
    dfs(lyuk, -1, ido, jerry_graf, be_ido, kis, volt, vago);

    vector<int> tom_tav = tavok(t, tom_graf, n);

    int x;
    for(int i = 0; i < j_db; i++){
        cin >> x;
        int elkapja = 0;

        // mely vagopontok vannak jerry es a lyuk kozott - itt tudja Tom biztosan elkapni
        vector<bool> volt(n+1, false);
        queue<int> q;
        q.push(x);
        volt[x] = true;
        int akt, akt_meret = 1, kov_meret = 0, tav = 0;
        while(!q.empty()){
            akt = q.front();
            akt_meret--;
            if(tav >= tom_tav[akt] && vago[akt]){
                elkapja = akt;
            }
            q.pop();

            for(int kov : jerry_graf[akt]){
                if(volt[kov]) continue;
                q.push(kov);
                kov_meret++;
                volt[kov] = true;
            }

            if(akt_meret == 0){
                swap(akt_meret, kov_meret);
                tav++;
            }
        }

        cout << elkapja << "\n";
    }


}
Részfeladat Összpont Teszt Verdikt Idő Memória
base 2/60
1 Elfogadva 0/0 3ms 1828 KiB
2 Időlimit túllépés 0/0 500ms 2988 KiB
3 Elfogadva 2/2 2ms 2492 KiB
4 Hibás válasz 0/2 2ms 2560 KiB
5 Hibás válasz 0/2 2ms 2416 KiB
6 Hibás válasz 0/3 2ms 2548 KiB
7 Hibás válasz 0/2 3ms 2904 KiB
8 Hibás válasz 0/2 14ms 3060 KiB
9 Hibás válasz 0/2 8ms 2904 KiB
10 Hibás válasz 0/3 20ms 3096 KiB
11 Hibás válasz 0/3 26ms 3124 KiB
12 Hibás válasz 0/3 100ms 3556 KiB
13 Hibás válasz 0/3 275ms 4460 KiB
14 Időlimit túllépés 0/3 458ms 3108 KiB
15 Időlimit túllépés 0/3 469ms 3460 KiB
16 Időlimit túllépés 0/3 465ms 3696 KiB
17 Időlimit túllépés 0/3 465ms 5508 KiB
18 Időlimit túllépés 0/3 462ms 8416 KiB
19 Időlimit túllépés 0/4 483ms 7220 KiB
20 Időlimit túllépés 0/4 469ms 9792 KiB
21 Időlimit túllépés 0/5 451ms 9892 KiB
22 Időlimit túllépés 0/5 462ms 11640 KiB