Submission #1282625

#TimeUsernameProblemLanguageResultExecution timeMemory
1282625LudisseyCities (BOI16_cities)C++20
100 / 100
3673 ms156596 KiB
#include <bits/stdc++.h>
#define sz(a) (int)a.size()
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
#define int long long
using namespace std;

const int LOG=24;

signed main() {
    ios_base::sync_with_stdio(false); cin.tie(nullptr);
    int n,k,m; cin >> n >> k >> m;
    vector<vector<pair<pair<int,int>,int>>> neigh(n);
    vector<int> spec(k);
    vector<vector<int>> sm_dist(k,vector<int>(n));
    for (int i = 0; i < k; i++) cin >> spec[i],spec[i]--; 
    
    for (int i = 0; i < m; i++)
    {
        int a,b,c; cin >> a >> b >> c;
        neigh[a-1].push_back({{b-1,c},i});
        neigh[b-1].push_back({{a-1,c},i});
    }
    for (int i = 0; i < sz(spec); i++)
    {
        vector<int> dist(n,1e18);
        vector<pair<int,int>> prev(n);
        vector<int> visited(n);
        priority_queue<pair<int,int>> pq;
        dist[spec[i]]=0;
        pq.push({-dist[spec[i]],spec[i]});
        while(!pq.empty()){
            int x=pq.top().second; pq.pop();
            if(visited[x]) continue;
            visited[x]=true;
            for (auto u : neigh[x])
            {
                if(dist[x]+u.first.second<dist[u.first.first]){
                    dist[u.first.first]=dist[x]+u.first.second;
                    pq.push({-dist[u.first.first],u.first.first});
                }
            }
        }
        for (int j = 0; j < n; j++)
        {
            sm_dist[i][j]=dist[j];
        }
        
    }
    int mn=1e18;
    vector<vector<int>> dist(n,vector<int>(1<<k,1e18));
    vector<vector<bool>> visited(n,vector<bool>(1<<k,0));
    priority_queue<pair<int,pair<int,int>>> pq;
    for (int i = 0; i < n; i++)
    {
        dist[i][0]=0;
        pq.push({-dist[i][0],{i,0}});
    }
    while(!pq.empty()){
        int x=pq.top().second.first,mask=pq.top().second.second; pq.pop();
        if(visited[x][mask]) continue;
        visited[x][mask]=true;
        if(mask==(1<<k)-1) mn=min(dist[x][mask],mn);
        for (auto u : neigh[x])
        {
            if(dist[x][mask]+u.first.second<dist[u.first.first][mask]){
                dist[u.first.first][mask]=dist[x][mask]+u.first.second;
                pq.push({-dist[u.first.first][mask],{u.first.first,mask}});
            }
        }
        for (int i = 0; i < k; i++)
        {
            if(!(mask&(1<<i))&&dist[x][mask]+sm_dist[i][x]<dist[x][mask^(1<<i)]) {
                dist[x][mask^(1<<i)]=dist[x][mask]+sm_dist[i][x];
                pq.push({-dist[x][mask^(1<<i)], {x,mask^(1<<i)}});
            }
        }
        
    }
    cout << mn << "\n";
    return 0;   
}
#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...