Submission #1309035

#TimeUsernameProblemLanguageResultExecution timeMemory
1309035ninstroyerVoting Cities (NOI22_votingcity)C++20
30 / 100
1097 ms57388 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][1<<5];
vector<pair<ll,ll>> adj[nx]; priority_queue<tuple<ll,ll,ll,ll>, vector<tuple<ll,ll,ll,ll>>, greater<tuple<ll,ll,ll,ll>>> pq;

ll Dijkstra(ll p[])
{
    for(int i = 0; i < n; i++) for(int j = 0; j < 32; j++) for(int k = 0; k < 32; k++) dist[i][j][k] = inf;
    while(!pq.empty()) pq.pop();
    int start = p[0];
    if(start < 0) return -1;
    for(int i = 0; i < (1<<5); i++)
    {
        ll cost = 0;
        bool valid = true;
        for(int j = 0; j < 5; j++)
        {
            if(i & (1<<j)) cost += p[j+1];
            else continue;
            if(p[j+1] == -1) valid = false;
        }
        dist[start][i][0] = cost;
        if(valid) pq.push({cost, start, i, 0});
    }
    while(!pq.empty())
    {
        auto [d, u, state, cur] = pq.top();
        pq.pop();
        if(d > dist[u][state][cur]) continue;
        for(auto [v, w] : adj[u])
        {
            if(w != inf && d + w < dist[v][state][cur])
            {
                dist[v][state][cur] = d+w;
                pq.push({dist[v][state][cur], v, state, cur});
            }
            for(int i = 1; i <= 5; i++)
            {
                if(!(1<<(i-1) & state) || (1<<(i-1) & cur)) continue;
                ll nw = cur | (1<<(i-1));
                if(w != inf && d + w*(10-i)/10 < dist[v][state][nw])
                {
                    dist[v][state][nw] = d + w*(10-i)/10;
                    pq.push({dist[v][state][nw], v, state, nw});
                }
            }
        }
    }
    ll res = inf;
    for(int i = 0; i < (1<<5); i++)
    {
        for(int j = 0; j < k; j++)
        {
            res = min(res, dist[t[j]][i][i]);
        }
    }
    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...