106972024-04-09 22:39:44mraronAutó-tortúracpp17Elfogadva 100/100768ms76420 KiB
// @check-accepted: examples very-small small-n small-l rest
#include<bits/stdc++.h>
using namespace std;

const int MAXN=3001;
const int MAXB=151;

#define LOG(x) cerr<<(#x)<<" = "<<x<<"\n";
#define chkmn(a,b) (a)=min((a), (b))

int n,m,k,l,b;

int path[MAXN], tank[MAXN];
vector<int> adj[MAXN];
int dist[MAXN][MAXN];
int tankDist[MAXB][MAXB];

void bfs(int ind) {
    queue<int> q;
    q.push(ind);
    
    vector<int> vis(n+1);
    vis[ind]=1;
    
    for(int j=1;j<=n;++j) {
        dist[ind][j]=1e9;
    }
    dist[ind][ind]=0;
    
    while(!q.empty()) {
        int i=q.front();q.pop();
        for(auto j:adj[i]) {
            if(!vis[j]) {
                vis[j]=1;
                q.push(j);
                dist[ind][j]=dist[ind][i]+1;
            }
        }
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    cin>>n>>m>>k;
    for(int i=0;i<m;++i) {
        int a,b;
        cin>>a>>b;
        adj[a].push_back(b);
        adj[b].push_back(a);
    }

    cin>>l;
    for(int i=0;i<l;++i) {
        cin>>path[i];
    }
        
    for(int i=1;i<=n;++i) {
        bfs(i);
    }

    cin>>b;
    for(int i=0;i<b;++i) {
        cin>>tank[i];
        
    }

    for(int i=0;i<b;++i) {
        tankDist[i][i]=0;
        for(int j=0;j<b;++j) {
            tankDist[i][j]=1e9;
            if(dist[tank[i]][tank[j]]<=k) {
                tankDist[i][j]=dist[tank[i]][tank[j]];
            }
        } 
    }

    for(int j=0;j<b;++j) {
        for(int i=0;i<b;++i) {
            for(int k=0;k<b;++k) {
                chkmn(tankDist[i][k], tankDist[i][j]+tankDist[j][k]);
            }
        }
    }

    vector<int> dp_prv, dp_nxt;
    dp_prv.assign(k+1, 1e9);
    dp_prv[k]=0;
    for(int i=1;i<l;++i) {
        dp_nxt.assign(k+1, 1e9);
        int need=dist[path[i-1]][path[i]];
        for(int j=need;j<=k;++j) {
            chkmn(dp_nxt[j-need], dp_prv[j]+need);
        }
        for(int j=k-1;j>=0;j--) {
            chkmn(dp_prv[j], dp_prv[j+1]);
        }

        for(int first_tank=0;first_tank<b;++first_tank) {
            for(int last_tank=0;last_tank<b;++last_tank) {
                if(tankDist[first_tank][last_tank]>=1e9) continue ;
                int while_tank=tankDist[first_tank][last_tank];
                int before_tank=dist[path[i-1]][tank[first_tank]];
                int after_tank=dist[path[i]][tank[last_tank]];
                int with_tank=k-after_tank;
                if(with_tank>=0 && before_tank<=k) {
                    chkmn(dp_nxt[with_tank], dp_prv[before_tank]+before_tank+while_tank+after_tank);
                }
            }
        }
        dp_prv.swap(dp_nxt);
    }

    int ans=*min_element(begin(dp_prv), end(dp_prv));
    if(ans>=1e9) {
        ans=-1;
    }
    cout<<ans<<"\n";
    
    return 0;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms2080 KiB
2Elfogadva377ms54788 KiB
subtask212/12
3Elfogadva3ms2560 KiB
4Elfogadva3ms2776 KiB
5Elfogadva3ms2888 KiB
6Elfogadva3ms2964 KiB
7Elfogadva3ms3188 KiB
8Elfogadva3ms3268 KiB
9Elfogadva3ms3400 KiB
10Elfogadva3ms3396 KiB
subtask318/18
11Elfogadva3ms2560 KiB
12Elfogadva3ms2776 KiB
13Elfogadva3ms2888 KiB
14Elfogadva3ms2964 KiB
15Elfogadva3ms3188 KiB
16Elfogadva3ms3268 KiB
17Elfogadva3ms3400 KiB
18Elfogadva3ms3396 KiB
19Elfogadva4ms4468 KiB
20Elfogadva17ms6156 KiB
21Elfogadva16ms6260 KiB
22Elfogadva16ms6284 KiB
23Elfogadva8ms6112 KiB
24Elfogadva7ms6404 KiB
25Elfogadva13ms6448 KiB
26Elfogadva13ms6452 KiB
27Elfogadva8ms6436 KiB
subtask425/25
28Elfogadva3ms2560 KiB
29Elfogadva3ms2776 KiB
30Elfogadva3ms2888 KiB
31Elfogadva3ms2964 KiB
32Elfogadva3ms3188 KiB
33Elfogadva3ms3268 KiB
34Elfogadva3ms3400 KiB
35Elfogadva3ms3396 KiB
36Elfogadva449ms74712 KiB
37Elfogadva398ms74908 KiB
38Elfogadva442ms75040 KiB
39Elfogadva439ms74848 KiB
40Elfogadva398ms74776 KiB
41Elfogadva370ms74752 KiB
42Elfogadva418ms75104 KiB
43Elfogadva284ms74936 KiB
44Elfogadva282ms74968 KiB
45Elfogadva125ms74964 KiB
subtask524/24
46Elfogadva451ms74860 KiB
47Elfogadva400ms74924 KiB
48Elfogadva444ms74872 KiB
49Elfogadva418ms75200 KiB
50Elfogadva273ms75284 KiB
51Elfogadva446ms75184 KiB
52Elfogadva404ms75404 KiB
53Elfogadva448ms75616 KiB
54Elfogadva409ms75500 KiB
55Elfogadva268ms75424 KiB
subtask621/21
56Elfogadva3ms2560 KiB
57Elfogadva3ms2776 KiB
58Elfogadva3ms2888 KiB
59Elfogadva3ms2964 KiB
60Elfogadva3ms3188 KiB
61Elfogadva3ms3268 KiB
62Elfogadva3ms3400 KiB
63Elfogadva3ms3396 KiB
64Elfogadva4ms4468 KiB
65Elfogadva17ms6156 KiB
66Elfogadva16ms6260 KiB
67Elfogadva16ms6284 KiB
68Elfogadva8ms6112 KiB
69Elfogadva7ms6404 KiB
70Elfogadva13ms6448 KiB
71Elfogadva13ms6452 KiB
72Elfogadva8ms6436 KiB
73Elfogadva449ms74712 KiB
74Elfogadva398ms74908 KiB
75Elfogadva442ms75040 KiB
76Elfogadva439ms74848 KiB
77Elfogadva398ms74776 KiB
78Elfogadva370ms74752 KiB
79Elfogadva418ms75104 KiB
80Elfogadva284ms74936 KiB
81Elfogadva282ms74968 KiB
82Elfogadva125ms74964 KiB
83Elfogadva451ms74860 KiB
84Elfogadva400ms74924 KiB
85Elfogadva444ms74872 KiB
86Elfogadva418ms75200 KiB
87Elfogadva273ms75284 KiB
88Elfogadva446ms75184 KiB
89Elfogadva404ms75404 KiB
90Elfogadva448ms75616 KiB
91Elfogadva409ms75500 KiB
92Elfogadva268ms75424 KiB
93Elfogadva367ms75468 KiB
94Elfogadva358ms75724 KiB
95Elfogadva456ms75844 KiB
96Elfogadva486ms75968 KiB
97Elfogadva150ms75796 KiB
98Elfogadva119ms21108 KiB
99Elfogadva460ms75816 KiB
100Elfogadva732ms75960 KiB
101Elfogadva768ms76032 KiB
102Elfogadva709ms75964 KiB
103Elfogadva620ms76092 KiB
104Elfogadva492ms75968 KiB
105Elfogadva617ms75908 KiB
106Elfogadva606ms75912 KiB
107Elfogadva600ms75916 KiB
108Elfogadva726ms76072 KiB
109Elfogadva159ms75920 KiB
110Elfogadva400ms75856 KiB
111Elfogadva444ms75960 KiB
112Elfogadva349ms75972 KiB
113Elfogadva377ms75900 KiB
114Elfogadva670ms76064 KiB
115Elfogadva453ms76300 KiB
116Elfogadva462ms76420 KiB
117Elfogadva488ms76224 KiB
118Elfogadva279ms76248 KiB