246052026-02-12 23:19:12pirosmacska10Tom és Jerry 1 (80)cpp17Elfogadva 80/8068ms4920 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
#include <string>
#include <cmath>
#include <queue>

using namespace std;
using ll=long long;

const ll INF=LLONG_MAX;

void bfs_tom(vector<vector<pair<int, int>>>& adj, int start, vector<int>& times, vector<bool>& visited) {
    vector<int> layer = {start};
    visited[start] = 1;
    int lay_num = 0;
    while (layer.size() != 0) {
        vector<int> new_layer;
        for(int node : layer) {
            times[node] = lay_num;
            for(auto [to, s] : adj[node]) {
                if(visited[to]) continue;
                if(s != 2) continue;
                visited[to] = 1;
                new_layer.push_back(to);
            }
        }
        lay_num++;
        layer.swap(new_layer);
    }
    
}

void dijkstra(vector<vector<pair<int, int>>>& adj, int start, vector<int>& times, vector<bool>& visited, vector<int>& tom_times) {
    priority_queue<pair<int, int>> pq;
    pq.push({tom_times[start]-1, start});
    while (!pq.empty()) {
        pair<int, int> node = pq.top();
        pq.pop();
        if(visited[node.second]) continue;
        visited[node.second] = 1;
        times[node.second] = node.first;
        for(auto [to, s] : adj[node.second]) {
            if(visited[to]) continue;
            pq.push({min(tom_times[to]-1, node.first-1), to});
        }
    }
    
}

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

    int n, m, t, p, e;
    cin >> n >> m >> t >> p >> e;
    vector<vector<pair<int, int>>> adj(n+1);
    for(int i = 0; i < m; i++) {
        int a, b, s;
        cin >> a >> b >> s;
        adj[a].push_back({b, s});
        adj[b].push_back({a, s});
    }
    vector<int> starts(p);
    for(int i = 0; i < p; i++) {
        cin >> starts[i];
    }
    vector<int> tom_times(n+1, 1e9);
    vector<bool> visited(n+1, 0);
    bfs_tom(adj, t, tom_times, visited);

    visited.assign(n+1, 0);
    vector<int> jerry_min_times(n+1, -1);
    dijkstra(adj, e, jerry_min_times, visited, tom_times);
    for(int i = 0; i < p; i++) {
        if(jerry_min_times[starts[i]] < 0) {
            cout << "NEM\n";
        } else cout << "IGEN\n";
    }
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base80/80
1Elfogadva0/01ms500 KiB
2Elfogadva0/02ms316 KiB
3Elfogadva4/41ms316 KiB
4Elfogadva4/41ms316 KiB
5Elfogadva4/41ms316 KiB
6Elfogadva4/42ms316 KiB
7Elfogadva4/42ms508 KiB
8Elfogadva4/42ms316 KiB
9Elfogadva4/42ms316 KiB
10Elfogadva4/42ms564 KiB
11Elfogadva4/47ms916 KiB
12Elfogadva4/48ms980 KiB
13Elfogadva4/414ms1388 KiB
14Elfogadva4/428ms2488 KiB
15Elfogadva4/441ms3124 KiB
16Elfogadva4/443ms4024 KiB
17Elfogadva4/468ms4552 KiB
18Elfogadva4/441ms3380 KiB
19Elfogadva4/439ms3568 KiB
20Elfogadva4/439ms3560 KiB
21Elfogadva4/435ms3124 KiB
22Elfogadva4/464ms4920 KiB