23952023-01-12 14:06:52sztomiTom és Jerry2 (60)cpp11Hibás válasz 5/60542ms17240 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, set<int>& vago){
    be_ido[akt] = kis[akt] = ido++;
    volt[akt] = true;
    //cout << "nez " << akt << " " << szulo << "\n";

    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{
            //cout << "indit " << akt << " " << kov << "\n";
            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] && szulo != -1){
                vago.insert(akt);
            }
        }
    }
    if(szulo == -1 && gyerek_db > 1){
        vago.insert(akt);
    }
}

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

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

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

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){
            if(a == lyuk || b == lyuk) continue;
            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);
    set<int> vago;
    dfs(lyuk, -1, ido, jerry_graf, be_ido, kis, volt, vago);
/*
    cout << "vagok: ";
    for(int x : vago){
        cout << x << " ";
    }
    cout << "\n";
*/
    vector<int> tom_tav = tavok(t, tom_graf, n);
    vector<int> jo_utak = legjobb_ut(lyuk, jerry_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
        int tav = 0;
        int akt = x;
        while(akt != lyuk){
            //cout << "itt jar: " << akt << "\n";
            if(tom_tav[akt] <= tav && vago.count(akt)){
                elkapja = akt;
            }

            akt = jo_utak[akt];
            tav++;
        }

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


}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base5/60
1Elfogadva0/03ms1888 KiB
2Hibás válasz0/010ms5152 KiB
3Elfogadva2/22ms2324 KiB
4Hibás válasz0/22ms2528 KiB
5Hibás válasz0/22ms2732 KiB
6Hibás válasz0/32ms2912 KiB
7Hibás válasz0/22ms3268 KiB
8Hibás válasz0/23ms3560 KiB
9Hibás válasz0/23ms3724 KiB
10Hibás válasz0/33ms3764 KiB
11Hibás válasz0/33ms3700 KiB
12Hibás válasz0/34ms4292 KiB
13Hibás válasz0/36ms5008 KiB
14Hibás válasz0/37ms5564 KiB
15Hibás válasz0/38ms6156 KiB
16Hibás válasz0/39ms6396 KiB
17Időlimit túllépés0/3500ms6080 KiB
18Elfogadva3/327ms13948 KiB
19Hibás válasz0/432ms12936 KiB
20Hibás válasz0/448ms17240 KiB
21Időlimit túllépés0/5462ms10648 KiB
22Időlimit túllépés0/5542ms12604 KiB