Submission #1159578

#TimeUsernameProblemLanguageResultExecution timeMemory
1159578PagodePaivaEscape Route (JOI21_escape_route)C++20
Compilation error
0 ms0 KiB
#include<bits/stdc++.h>
#define int long long

using namespace std;

const int N = 41;
const int inf = 1e16;
int n, m, s, q;
int dp[N][N];
vector <array <int, 3>> g[N];
int dist[N];
int last[N];

void solve(int st){
    dp[st][st] = 0;
    for(int i = 0;i < n;i++){
        dist[i] = inf;
    }
    dist[st] = 0;
    priority_queue <pair <int, int>> pq;
    pq.push({0, st});
    while(!pq.empty()){
        auto [tempo, v] = pq.top();
        pq.pop();
        tempo *= -1;
        if(tempo != dist[v]) continue;
        for(auto [x, l, c] : g[v]){
            if(dist[v]+l > c) continue;
            if(dist[v]+l < dist[x]){
                dist[x] = dist[v]+l;
                dp[st][x] = dist[x];
                pq.push({-dist[x], x});
            }
        }
    }
    return;
}

pair <int, int> dist2[N];

void solve2(int u, int v, int t){
    set <int> vertices;
    for(int i = 0;i < n;i++){
        dist[i] = inf;
    }
    dist[u] = t;
    priority_queue <pair <int, int>> pq;
    pq.push({-t, u});
    while(!pq.empty()){
        auto [tempo, v] = pq.top();
        pq.pop();
        tempo *= -1;
        if(tempo != dist[v]) continue;
        vertices.insert(v);
        for(auto [x, l, c] : g[v]){
            if(dist[v]+l > c) continue;
            if(dist[v]+l < dist[x]){
                dist[x] = dist[v]+l;
                pq.push({-dist[x], x});
            }
        }
    }
    for(int i = 0;i < n;i++){
        dist2[i] = {90, inf};
    }
    for(auto i : vertices){
        dist2[i] = {0, dist[i]};
        pq.push({-s*dist2[i].first-dist2[i].second, i});
    }
    while(!pq.empty()){
        auto [d, v] = pq.top();
        pq.pop();
        d *= -1;
        //cout << d << ' ' << v << '\n';
        if(d != dist2[v].first*s+dist2[v].second) continue;
        for(int i = 0;i < n;i++){
            if(dp[v][i] > -1){
                if((dist2[v].first+1)*s+dp[v][i] < dist2[i].first*s+dist2[i].second){
                    dist2[i] = make_pair(dist2[v].first+1, dp[v][i]);
                    pq.push({-s*dist2[i].first-dist2[i].second, i});
                }
            }
        }
    }
    cout << dist2[v].first*s+dist2[v].second-t << '\n';
}

int32_t main(){
    ios::sync_with_stdio(false); cin.tie(0);
    memset(dp, -1, sizeof dp);
    cin >> n >> m >> s >> q;    
    for(int i = 0;i < m;i++){
        int a, b, l, c;
        cin >> a >> b >> l >> c;
        g[a].push_back({b, l, c});
        g[b].push_back({a, l, c});
    }
    for(int i = 0;i < n;i++){
        solve(i);
    }
    for(int i = 0;i < n;i++){
        for(int j = 0;j < n;j++){
            cout << dp[i][j] << ' ';
        }
        cout << '\n';
    }
    while(q--){
        int u, v, t;
        cin >> u >> v >> t;
        solve2(u, v, t);
    }
}

Compilation message (stderr)

/usr/bin/ld: /tmp/ccfi0IQI.o: in function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/cc3oR1RH.o:escape_route.cpp:(.text.startup+0x0): first defined here
/usr/bin/ld: /tmp/ccfi0IQI.o: in function `main':
grader.cpp:(.text.startup+0x6e0): undefined reference to `calculate_necessary_time(int, int, long long, int, std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> >, std::vector<long long, std::allocator<long long> >, std::vector<long long, std::allocator<long long> >, std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> >, std::vector<long long, std::allocator<long long> >)'
collect2: error: ld returned 1 exit status