160642025-03-30 11:09:01szilAutó-tortúracpp17Elfogadva 100/100801ms71344 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const int MAXN = 3001;
const int MAXB = 151;
const ll INF = 1e14;

vector<int> g[MAXN];
ll bdist[MAXB][MAXB], dist[MAXN][MAXN];
int n, m, k;

void bfs(int st) {
    fill(dist[st], dist[st]+MAXN, INF);
    queue<int> q;
    q.push(st);
    dist[st][st] = 0;
    while (!q.empty()) {
        int u = q.front(); q.pop();
        for (int v : g[u]) {
            if (dist[st][v] > dist[st][u] + 1) {
                dist[st][v] = dist[st][u] + 1;
                q.push(v);
            }
        }
    }
}

void solve() {
    cin >> n >> m >> k;
    
    for (int i = 0; i < m; i++) {
        int a, b; cin >> a >> b;
        g[a].emplace_back(b);
        g[b].emplace_back(a);
    }

    int l; cin >> l;
    vector<int> terv(l+1);
    for (int i = 1; i <= l; i++) cin >> terv[i];
    int b; cin >> b;
    vector<int> ben(b+1);
    for (int i = 1; i <= b; i++) cin >> ben[i];

    for (int i = 1; i <= n; i++) {
        bfs(i);
    }

    for (int i = 1; i <= b; i++) {
        for (int j = 1; j <= b; j++) {
            bdist[i][j] = INF;
        }
        bdist[i][i] = 0;
    }

    for (int i = 1; i <= b; i++) {
        for (int j = 1; j <= b; j++) {
            int u = ben[i];
            int v = ben[j];

            if (dist[u][v] <= k) {
                bdist[i][j] = min(bdist[i][j], dist[u][v]);
            }
        }
    }

    for (int c = 1; c <= b; c++) {
        for (int i = 1; i <= b; i++) {
            for (int j = 1; j <= b; j++) {
                bdist[i][j] = min(bdist[i][j], bdist[i][c] + bdist[c][j]);
            }
        }
    }

    vector<ll> dp_last(k+1);
    for (int a = 2; a <= l; a++) {
        vector<ll> dp_curr(k+1, INF);

        int start = terv[a-1];
        int goal = terv[a];

        for (int i = 1; i <= b; i++) {
            for (int j = 1; j <= b; j++) {
                ll d = dist[start][ben[i]] + bdist[i][j] + dist[ben[j]][goal];
                ll need = dist[start][ben[i]];
                ll left = k - dist[ben[j]][goal];

                
                if (need > k) continue;
                if (left < 0) continue;

                d += dp_last[need];
                dp_curr[left] = min(dp_curr[left], d);
            }
        }

        for (int i = 0; i <= k - dist[start][goal]; i++) {
            dp_curr[i] = min(dp_curr[i], dist[start][goal] + dp_last[i + dist[start][goal]]);
        }

        for (int i = k-1; i >= 0; i--) {
            dp_curr[i] = min(dp_curr[i], dp_curr[i+1]);
        }

        dp_last = dp_curr;
    }

    ll ans = *min_element(dp_last.begin(), dp_last.end());
    cout << (ans >= INF ? -1 : ans) << "\n";
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int t = 1; 
    // cin >> t;
    while (t--) solve();
    return 0;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva1ms748 KiB
2Elfogadva412ms52824 KiB
subtask212/12
3Elfogadva1ms564 KiB
4Elfogadva1ms564 KiB
5Elfogadva1ms756 KiB
6Elfogadva1ms564 KiB
7Elfogadva1ms492 KiB
8Elfogadva1ms564 KiB
9Elfogadva1ms580 KiB
10Elfogadva1ms564 KiB
subtask318/18
11Elfogadva1ms564 KiB
12Elfogadva1ms564 KiB
13Elfogadva1ms756 KiB
14Elfogadva1ms564 KiB
15Elfogadva1ms492 KiB
16Elfogadva1ms564 KiB
17Elfogadva1ms580 KiB
18Elfogadva1ms564 KiB
19Elfogadva4ms2872 KiB
20Elfogadva19ms6512 KiB
21Elfogadva18ms6316 KiB
22Elfogadva17ms6520 KiB
23Elfogadva8ms6392 KiB
24Elfogadva8ms6516 KiB
25Elfogadva20ms6504 KiB
26Elfogadva18ms6476 KiB
27Elfogadva10ms6488 KiB
subtask425/25
28Elfogadva1ms564 KiB
29Elfogadva1ms564 KiB
30Elfogadva1ms756 KiB
31Elfogadva1ms564 KiB
32Elfogadva1ms492 KiB
33Elfogadva1ms564 KiB
34Elfogadva1ms580 KiB
35Elfogadva1ms564 KiB
36Elfogadva488ms71080 KiB
37Elfogadva425ms71220 KiB
38Elfogadva467ms71180 KiB
39Elfogadva477ms71072 KiB
40Elfogadva428ms70964 KiB
41Elfogadva407ms70956 KiB
42Elfogadva425ms71220 KiB
43Elfogadva293ms71220 KiB
44Elfogadva293ms71220 KiB
45Elfogadva149ms71224 KiB
subtask524/24
46Elfogadva474ms70964 KiB
47Elfogadva437ms70964 KiB
48Elfogadva467ms71124 KiB
49Elfogadva419ms70888 KiB
50Elfogadva294ms70932 KiB
51Elfogadva483ms70924 KiB
52Elfogadva421ms70960 KiB
53Elfogadva463ms70964 KiB
54Elfogadva418ms70964 KiB
55Elfogadva282ms70964 KiB
subtask621/21
56Elfogadva1ms564 KiB
57Elfogadva1ms564 KiB
58Elfogadva1ms756 KiB
59Elfogadva1ms564 KiB
60Elfogadva1ms492 KiB
61Elfogadva1ms564 KiB
62Elfogadva1ms580 KiB
63Elfogadva1ms564 KiB
64Elfogadva4ms2872 KiB
65Elfogadva19ms6512 KiB
66Elfogadva18ms6316 KiB
67Elfogadva17ms6520 KiB
68Elfogadva8ms6392 KiB
69Elfogadva8ms6516 KiB
70Elfogadva20ms6504 KiB
71Elfogadva18ms6476 KiB
72Elfogadva10ms6488 KiB
73Elfogadva488ms71080 KiB
74Elfogadva425ms71220 KiB
75Elfogadva467ms71180 KiB
76Elfogadva477ms71072 KiB
77Elfogadva428ms70964 KiB
78Elfogadva407ms70956 KiB
79Elfogadva425ms71220 KiB
80Elfogadva293ms71220 KiB
81Elfogadva293ms71220 KiB
82Elfogadva149ms71224 KiB
83Elfogadva474ms70964 KiB
84Elfogadva437ms70964 KiB
85Elfogadva467ms71124 KiB
86Elfogadva419ms70888 KiB
87Elfogadva294ms70932 KiB
88Elfogadva483ms70924 KiB
89Elfogadva421ms70960 KiB
90Elfogadva463ms70964 KiB
91Elfogadva418ms70964 KiB
92Elfogadva282ms70964 KiB
93Elfogadva365ms71216 KiB
94Elfogadva349ms71196 KiB
95Elfogadva444ms71216 KiB
96Elfogadva526ms71232 KiB
97Elfogadva170ms71224 KiB
98Elfogadva127ms24128 KiB
99Elfogadva486ms71220 KiB
100Elfogadva777ms71304 KiB
101Elfogadva800ms71292 KiB
102Elfogadva740ms71220 KiB
103Elfogadva629ms71220 KiB
104Elfogadva509ms71160 KiB
105Elfogadva619ms71092 KiB
106Elfogadva699ms71224 KiB
107Elfogadva570ms71220 KiB
108Elfogadva801ms71344 KiB
109Elfogadva170ms70968 KiB
110Elfogadva423ms70964 KiB
111Elfogadva432ms70960 KiB
112Elfogadva330ms70964 KiB
113Elfogadva368ms70964 KiB
114Elfogadva665ms71220 KiB
115Elfogadva467ms71220 KiB
116Elfogadva483ms71220 KiB
117Elfogadva722ms71220 KiB
118Elfogadva316ms71220 KiB