160642025-03-30 11:09:01szilAutó-tortúracpp17Accepted 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;
}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted1ms748 KiB
2Accepted412ms52824 KiB
subtask212/12
3Accepted1ms564 KiB
4Accepted1ms564 KiB
5Accepted1ms756 KiB
6Accepted1ms564 KiB
7Accepted1ms492 KiB
8Accepted1ms564 KiB
9Accepted1ms580 KiB
10Accepted1ms564 KiB
subtask318/18
11Accepted1ms564 KiB
12Accepted1ms564 KiB
13Accepted1ms756 KiB
14Accepted1ms564 KiB
15Accepted1ms492 KiB
16Accepted1ms564 KiB
17Accepted1ms580 KiB
18Accepted1ms564 KiB
19Accepted4ms2872 KiB
20Accepted19ms6512 KiB
21Accepted18ms6316 KiB
22Accepted17ms6520 KiB
23Accepted8ms6392 KiB
24Accepted8ms6516 KiB
25Accepted20ms6504 KiB
26Accepted18ms6476 KiB
27Accepted10ms6488 KiB
subtask425/25
28Accepted1ms564 KiB
29Accepted1ms564 KiB
30Accepted1ms756 KiB
31Accepted1ms564 KiB
32Accepted1ms492 KiB
33Accepted1ms564 KiB
34Accepted1ms580 KiB
35Accepted1ms564 KiB
36Accepted488ms71080 KiB
37Accepted425ms71220 KiB
38Accepted467ms71180 KiB
39Accepted477ms71072 KiB
40Accepted428ms70964 KiB
41Accepted407ms70956 KiB
42Accepted425ms71220 KiB
43Accepted293ms71220 KiB
44Accepted293ms71220 KiB
45Accepted149ms71224 KiB
subtask524/24
46Accepted474ms70964 KiB
47Accepted437ms70964 KiB
48Accepted467ms71124 KiB
49Accepted419ms70888 KiB
50Accepted294ms70932 KiB
51Accepted483ms70924 KiB
52Accepted421ms70960 KiB
53Accepted463ms70964 KiB
54Accepted418ms70964 KiB
55Accepted282ms70964 KiB
subtask621/21
56Accepted1ms564 KiB
57Accepted1ms564 KiB
58Accepted1ms756 KiB
59Accepted1ms564 KiB
60Accepted1ms492 KiB
61Accepted1ms564 KiB
62Accepted1ms580 KiB
63Accepted1ms564 KiB
64Accepted4ms2872 KiB
65Accepted19ms6512 KiB
66Accepted18ms6316 KiB
67Accepted17ms6520 KiB
68Accepted8ms6392 KiB
69Accepted8ms6516 KiB
70Accepted20ms6504 KiB
71Accepted18ms6476 KiB
72Accepted10ms6488 KiB
73Accepted488ms71080 KiB
74Accepted425ms71220 KiB
75Accepted467ms71180 KiB
76Accepted477ms71072 KiB
77Accepted428ms70964 KiB
78Accepted407ms70956 KiB
79Accepted425ms71220 KiB
80Accepted293ms71220 KiB
81Accepted293ms71220 KiB
82Accepted149ms71224 KiB
83Accepted474ms70964 KiB
84Accepted437ms70964 KiB
85Accepted467ms71124 KiB
86Accepted419ms70888 KiB
87Accepted294ms70932 KiB
88Accepted483ms70924 KiB
89Accepted421ms70960 KiB
90Accepted463ms70964 KiB
91Accepted418ms70964 KiB
92Accepted282ms70964 KiB
93Accepted365ms71216 KiB
94Accepted349ms71196 KiB
95Accepted444ms71216 KiB
96Accepted526ms71232 KiB
97Accepted170ms71224 KiB
98Accepted127ms24128 KiB
99Accepted486ms71220 KiB
100Accepted777ms71304 KiB
101Accepted800ms71292 KiB
102Accepted740ms71220 KiB
103Accepted629ms71220 KiB
104Accepted509ms71160 KiB
105Accepted619ms71092 KiB
106Accepted699ms71224 KiB
107Accepted570ms71220 KiB
108Accepted801ms71344 KiB
109Accepted170ms70968 KiB
110Accepted423ms70964 KiB
111Accepted432ms70960 KiB
112Accepted330ms70964 KiB
113Accepted368ms70964 KiB
114Accepted665ms71220 KiB
115Accepted467ms71220 KiB
116Accepted483ms71220 KiB
117Accepted722ms71220 KiB
118Accepted316ms71220 KiB