130232025-01-04 18:03:05arnoldbeilandTom és Jerry 1 (80)cpp17Elfogadva 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;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base80/80
1Elfogadva0/01ms320 KiB
2Elfogadva0/03ms320 KiB
3Elfogadva4/41ms320 KiB
4Elfogadva4/41ms320 KiB
5Elfogadva4/41ms320 KiB
6Elfogadva4/41ms320 KiB
7Elfogadva4/41ms320 KiB
8Elfogadva4/42ms320 KiB
9Elfogadva4/43ms496 KiB
10Elfogadva4/43ms320 KiB
11Elfogadva4/49ms568 KiB
12Elfogadva4/412ms1048 KiB
13Elfogadva4/421ms1424 KiB
14Elfogadva4/445ms2220 KiB
15Elfogadva4/464ms2920 KiB
16Elfogadva4/464ms3996 KiB
17Elfogadva4/497ms4028 KiB
18Elfogadva4/464ms3128 KiB
19Elfogadva4/479ms3384 KiB
20Elfogadva4/479ms3384 KiB
21Elfogadva4/467ms2872 KiB
22Elfogadva4/4114ms4324 KiB