Submission #1309049

#TimeUsernameProblemLanguageResultExecution timeMemory
1309049ninstroyerVoting Cities (NOI22_votingcity)C++20
45 / 100
1094 ms5184 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;

    dist[start][0] = 0;
    pq.push({0, start, 0});

    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});
            }

            for(int i = 1; i <= 5; i++)
            {
                if((1 << (i-1)) & state) continue;
                if(p[i] == -1) continue;

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

                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...