Submission #1309053

#TimeUsernameProblemLanguageResultExecution timeMemory
1309053ninstroyerVoting Cities (NOI22_votingcity)C++20
100 / 100
160 ms2980 KiB
#include<bits/stdc++.h>
using namespace std;
#define ll long long

const ll nx = 5e3+5, inf = 4e18;

ll n,e,k,q,t[nx],p[6],dist[nx][1<<5];
vector<pair<ll,ll>> adj[nx];
priority_queue<tuple<ll,ll,ll>, vector<tuple<ll,ll,ll>>, greater<tuple<ll,ll,ll>>> pq;

ll Dijkstra(ll p[])
{
    for(int i = 0; i < n; i++)
        for(int j = 0; j < 32; j++)
            dist[i][j] = inf;

    while(!pq.empty()) pq.pop();

    int start = p[0];
    if(start < 0) return -1;
    ll bits = 0;
    for(int i = 1; i <= 5; i++) if(p[i] != -1) bits = bits | (1<<(i-1));
    dist[start][bits] = 0;
    pq.push({0,start,bits});

    while(!pq.empty())
    {
        auto [d, u, state] = pq.top();
        pq.pop();
        if(d > dist[u][state]) continue;

        for(auto [v, w] : adj[u])
        {
            if(w != inf && d + w < dist[v][state])
            {
                dist[v][state] = d + w;
                pq.push({dist[v][state], v, state});
            }
            if(state == 0) continue;
            for(int i = 1; i <= 5; i++)
            {
                if(!((1 << (i-1)) & state)) continue;

                ll nw = state ^ (1 << (i-1));
                ll cost = w * (10 - i) / 10;

                if(w < cost + p[i]) continue;

                if(w != inf && d + cost + p[i] < dist[v][nw])
                {
                    dist[v][nw] = d + cost + p[i];
                    pq.push({dist[v][nw], v, nw});
                }
            }
        }
    }

    ll res = inf;
    for(int i = 0; i < k; i++)
        for(int j = 0; j < (1<<5); j++)
            res = min(res, dist[t[i]][j]);

    return (res == inf ? -1 : res);
}

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

    cin >> n >> e >> k;
    for(int i = 0; i < k; i++) cin >> t[i];

    for(int i = 0; i < e; i++)
    {
        ll u, v, w;
        cin >> u >> v >> w;
        adj[u].push_back({v, w});
    }

    cin >> q;
    for(int i = 0; i < q; i++)
    {
        cin >> p[0] >> p[1] >> p[2] >> p[3] >> p[4] >> p[5];
        cout << Dijkstra(p) << "\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...