113312024-08-16 00:11:00kukkermanFertőzési sorozat (50 pont)cpp17Elfogadva 50/50216ms1552 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>

void beolvas(std::istream &be, int &n, std::vector<std::pair<int, int>> &kapcsolatok, std::vector<int> &f_sorozat) {
    int m, k;
    be >> n >> m >> k;

    f_sorozat.resize(k);
    for (auto &x : f_sorozat) {
        be >> x;
    }

    kapcsolatok.resize(m);
    for (auto &x : kapcsolatok) {
        be >> x.first >> x.second;
    }
}

void feldolgoz(int n, const std::vector<std::pair<int, int>> &kapcsolatok, std::vector<int> &f_sorozat) {
    std::vector<std::vector<int>> tav(n, std::vector<int>(n, -1));

    for (const auto &k : kapcsolatok) {
        tav[k.first - 1][k.second - 1] = 1;
        tav[k.second - 1][k.first - 1] = 1;
    }

    for (int i = 0; i < n; i++) {
        tav[i][i] = 0;
    }

    for (int k = 0; k < n; k++) {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (tav[i][k] != -1 && tav[k][j] != -1 && (tav[i][j] == -1 || tav[i][k] + tav[k][j] < tav[i][j])) {
                    tav[i][j] = tav[i][k] + tav[k][j];
                }
            }
        }
    }

    for (auto &f : f_sorozat) {
        --f;
    }

    const int k = static_cast<int>(f_sorozat.size());
    std::vector<bool> zero_jelolt(n, true);
    for (int i = 1; i < k; i++) {
        zero_jelolt[f_sorozat[i]] = false;
    }

    std::vector<int> zero_paciensek;
    for (int p = 0; p < n; p++) {
        if (zero_jelolt[p]) {
            if (k == 1) {
                zero_paciensek.push_back(p);
                continue;
            }

            const auto &p_tav = tav[p];

            int f;
            for (f = 1; f < k && p_tav[f_sorozat[f]] == p_tav[f_sorozat[0]]; f++) { }

            std::vector<int> teljes_sorrend(n);
            iota(teljes_sorrend.begin(), teljes_sorrend.end(), 0);
            sort(teljes_sorrend.begin(), teljes_sorrend.end(), [&](int a, int b) { return p_tav[a] < p_tav[b]; });

            int t;
            for (t = 0; t < n && p_tav[teljes_sorrend[t]] <= p_tav[f_sorozat[0]]; t++) { }
            t -= f;

            int i;
            for (i = 0; i < k && t + i < n && p_tav[teljes_sorrend[t + i]] == p_tav[f_sorozat[i]]; i++) { }

            if (i == k) {
                zero_paciensek.push_back(p);
            }
        }
    }

    std::cout << zero_paciensek.size() << '\n';
    for (auto p : zero_paciensek) {
        std::cout << p + 1 << ' ';
    }
    std::cout << '\n';
}

int main() {
    int n;
    std::vector<std::pair<int, int>> kapcsolatok;
    std::vector<int> f_sorozat;
    beolvas(std::cin, n, kapcsolatok, f_sorozat);

    feldolgoz(n, kapcsolatok, f_sorozat);

    return 0;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base50/50
1Elfogadva0/03ms564 KiB
2Elfogadva0/03ms392 KiB
3Elfogadva0/029ms648 KiB
4Elfogadva2/23ms384 KiB
5Elfogadva2/24ms356 KiB
6Elfogadva2/228ms756 KiB
7Elfogadva2/228ms688 KiB
8Elfogadva2/229ms612 KiB
9Elfogadva2/230ms668 KiB
10Elfogadva2/2208ms1452 KiB
11Elfogadva1/13ms504 KiB
12Elfogadva2/2152ms1380 KiB
13Elfogadva2/2153ms1380 KiB
14Elfogadva2/2175ms1344 KiB
15Elfogadva2/2160ms1436 KiB
16Elfogadva2/2150ms1484 KiB
17Elfogadva2/2150ms1508 KiB
18Elfogadva1/1158ms1508 KiB
19Elfogadva1/1149ms1512 KiB
20Elfogadva1/1150ms1380 KiB
21Elfogadva1/1209ms1380 KiB
22Elfogadva1/1197ms1528 KiB
23Elfogadva1/1174ms1380 KiB
24Elfogadva1/1170ms1312 KiB
25Elfogadva1/1194ms1380 KiB
26Elfogadva1/1216ms1504 KiB
27Elfogadva1/1215ms1380 KiB
28Elfogadva1/1175ms1552 KiB
29Elfogadva1/1180ms1380 KiB
30Elfogadva1/1170ms1428 KiB
31Elfogadva1/1174ms1416 KiB
32Elfogadva1/1206ms1252 KiB
33Elfogadva1/1208ms1444 KiB
34Elfogadva1/1211ms1404 KiB
35Elfogadva1/1210ms1532 KiB
36Elfogadva1/1211ms1380 KiB
37Elfogadva1/1212ms1380 KiB
38Elfogadva1/1210ms1380 KiB
39Elfogadva1/1177ms1380 KiB
40Elfogadva1/1204ms1512 KiB