130232025-01-04 18:03:05arnoldbeilandTom és Jerry 1 (80)cpp17Accepted 80/80114ms4324 KiB
#include <iostream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;

void bfs_tom(
    int t, const vector<vector<pair<int,bool>>> &adj,
    vector<int> &limit)
{
    queue<int> q;
    q.push(t);
    limit[t] = 0;

    while (!q.empty()) {
        int v = q.front();
        q.pop();

        for (auto p : adj[v]) {
            if (p.second && limit[p.first] == INT_MAX) {
                limit[p.first] = limit[v] + 1;
                q.push(p.first);
            }
        }
    }
}

void smecher(
    int e, const vector<vector<pair<int,bool>>> &adj,
    const vector<int> &limit,
    vector<int> &rem)
{
    priority_queue<
        pair<int, int>, // (rem, v)
        vector<pair<int,int>>,
        less<pair<int,int>>> pq;

    rem[e] = limit[e]-1;
    pq.push({rem[e], e});

    while (!pq.empty()) {
        int remv = pq.top().first;
        int v = pq.top().second;
        pq.pop();

        if (rem[v] == remv) {
            for (auto p : adj[v]) {
                int sz = p.first;
                if (limit[sz] > 0 && remv > 0) {
                    int ujrem = min(remv-1, limit[sz]-1);
                    if (ujrem > rem[sz]) {
                        rem[sz] = ujrem;
                        pq.push({rem[sz],sz});
                    }
                }
            }
        }
    }
}

int main()
{
    int n, m, t, p, e;
    cin >> n >> m >> t >> p >> e;

    vector<vector<pair<int,bool>>> adj(n+1);
        // .first == ki a szomszéd
        // .second == true, ha tom is mehet ott

    for (int i = 0; i < m; i++) {
        int a, b, tip;
        cin >> a >> b >> tip;
        bool mehet = (tip == 2);

        adj[a].push_back({b, mehet});
        adj[b].push_back({a, mehet});
    }

    vector<int> limit(n+1, INT_MAX);

    bfs_tom(t, adj, limit);

    vector<int> rem(n+1, -1);

    smecher(e, adj, limit, rem);

    for (int i = 0; i < p; i++) {
        int start;
        cin >> start;

        if (rem[start] >= 0)
            cout << "IGEN\n";
        else
            cout << "NEM\n";
    }

    return 0;
}
SubtaskSumTestVerdictTimeMemory
base80/80
1Accepted0/01ms320 KiB
2Accepted0/03ms320 KiB
3Accepted4/41ms320 KiB
4Accepted4/41ms320 KiB
5Accepted4/41ms320 KiB
6Accepted4/41ms320 KiB
7Accepted4/41ms320 KiB
8Accepted4/42ms320 KiB
9Accepted4/43ms496 KiB
10Accepted4/43ms320 KiB
11Accepted4/49ms568 KiB
12Accepted4/412ms1048 KiB
13Accepted4/421ms1424 KiB
14Accepted4/445ms2220 KiB
15Accepted4/464ms2920 KiB
16Accepted4/464ms3996 KiB
17Accepted4/497ms4028 KiB
18Accepted4/464ms3128 KiB
19Accepted4/479ms3384 KiB
20Accepted4/479ms3384 KiB
21Accepted4/467ms2872 KiB
22Accepted4/4114ms4324 KiB