24822023-01-13 12:43:51rennTom és Jerry2 (60)cpp11Időlimit túllépés 4/60500ms11500 KiB
#include <bits/stdc++.h>
using namespace std;

#define InTheNameOfGod cin.tie(0); cout.tie(0); ios::sync_with_stdio(0);
typedef vector<vector<int>> graf;
typedef vector<int> vi;
typedef vector<bool> vb;

vb cuts;
int timer;
void dfs(int v, int p, graf &adj, vb &volt, vi &tin, vi &low) {
    volt[v] = true;
    tin[v] = low[v] = timer++;
    int children=0;
    for (int to : adj[v]) {
        if (to == p) continue;
        if (volt[to]) {
            low[v] = min(low[v], tin[to]);
        } else {
            dfs(to, v, adj, volt, tin, low);
            low[v] = min(low[v], low[to]);
            if (low[to] >= tin[v] && p!=-1)
                cuts[v] = true;
            ++children;
        }
    }
    if(p == -1 && children > 1)
        cuts[v] = true;
}

inline int bfs(graf &g, int &k, vi &tavok)
{
    queue<int> next;
    next.push(k);
    tavok[k] = 0;

    int i;
    while(!next.empty())
    {
        i = next.front();
        next.pop();

        for(auto &x : g[i])
        {
            if(tavok[x] > -1) continue;

            next.push(x);
            tavok[x] = tavok[i]+1;
        }
    }

    return 0;
}

inline int jerry_bfs(graf &g, int &k, vi &tavok, vi &tomtavok, int &e)
{
    queue<int> next;
    next.push(k);
    tavok[k] = 0;

    int i, j;
    while(!next.empty())
    {
        i = next.front();
        next.pop();

        for(auto &x : g[i])
        {
            if(tavok[x] > -1)
                continue;
            
            if(cuts[x])
                if(tomtavok[x] <= tavok[i]+1)
                {
                    j = x;
                    continue;
                }
            
            if(x == e)
                return 0;

            next.push(x);
            tavok[x] = tavok[i]+1;
        }
    }

    return j+1;
}

int main()
{

    //InTheNameOfGod

    int n, m, t, jdb, j, e;
    cin >> n >> m >> t >> jdb >> e;
    e--;
    t--;

    vi tomd(n, -1);
    graf tom(n);
    graf jerry(n);
    cuts.assign(n, false);

    int a, b, c;
    bool h;

    while(m--)
    {
        cin >> a >> b >> c;
        a--; b--;

        if(((c&1)^1) && a!=e && b!=e)
        {
            tom[a].push_back(b);
            tom[b].push_back(a);
        }

        jerry[a].push_back(b);
        jerry[b].push_back(a);
    }

    bfs(tom, t, tomd);

    timer = 0;
    vb volt(n, false);
    vi tin(n, -1);
    vi low(n, -1);
    dfs(e, -1, jerry, volt, tin, low);

    while(jdb--)
    {
        vi jerryd(n, -1);

        cin >> j;
        j--;

        cout << jerry_bfs(jerry, j, jerryd, tomd, e) << "\n";
    }

    return 0;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base4/60
1Elfogadva0/03ms1684 KiB
2Időlimit túllépés0/0500ms2644 KiB
3Elfogadva2/22ms2048 KiB
4Hibás válasz0/22ms2304 KiB
5Hibás válasz0/22ms2380 KiB
6Hibás válasz0/32ms2516 KiB
7Elfogadva2/23ms2756 KiB
8Hibás válasz0/24ms2976 KiB
9Hibás válasz0/24ms3076 KiB
10Hibás válasz0/37ms3224 KiB
11Hibás válasz0/324ms3512 KiB
12Hibás válasz0/318ms4008 KiB
13Hibás válasz0/326ms5028 KiB
14Hibás válasz0/335ms5464 KiB
15Hibás válasz0/354ms6072 KiB
16Hibás válasz0/372ms6460 KiB
17Időlimit túllépés0/3485ms5880 KiB
18Időlimit túllépés0/3477ms8784 KiB
19Időlimit túllépés0/4449ms7812 KiB
20Időlimit túllépés0/4462ms10088 KiB
21Időlimit túllépés0/5467ms9828 KiB
22Időlimit túllépés0/5467ms11500 KiB