Submission #697925

#TimeUsernameProblemLanguageResultExecution timeMemory
697925FEDIKUSCities (BOI16_cities)C++17
14 / 100
472 ms21528 KiB
#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

const ll maxn=2e5+10;
const ll inf=1e15;

ll n,k,m;

ll spec[10];
vector<pair<ll,ll> > g[maxn];
vector<pair<ll,pair<ll,ll> > > ng;
int vel;
ll sta1[maxn];
ll sta2[maxn];
ll d[6][maxn];
ll naj[(1<<6)];

void dijkstra(ll poc,ll* dist){
    priority_queue<pair<ll,ll> > pq;
    pq.push(pair<ll,ll>(0,poc));
    for(ll i=1;i<=n;i++) dist[i]=inf;
    dist[poc]=0;
    while(!pq.empty()){
        auto tren=pq.top();
        pq.pop();
        tren.first*=-1;
        if(dist[tren.second]<tren.first) continue;
        for(auto i:g[tren.second]){
            if(dist[i.first]>tren.first+i.second) pq.push(pair<ll,ll>(-tren.first-i.second,i.first));
            dist[i.first]=min(dist[i.first],tren.first+i.second);
        }
    }
}

ll dsu[maxn];

int root(int node){
    return dsu[node]==node ? node:dsu[node]=root(dsu[node]);
}

void join(int a,int b){
    a=root(a); b=root(b);
    dsu[a]=b;
}

ll mst(){
    for(ll i=1;i<=vel;i++) dsu[i]=i;
    sort(ng.begin(),ng.end());
    ll ret=0;
    for(auto i:ng){
        if(root(i.second.first)==root(i.second.second)) continue;
        ret+=i.first;
        join(i.second.first,i.second.second);
    }
    return ret;
}

ll dp[1<<6];

int main(){
    cin>>n>>k>>m;
    for(ll i=0;i<k;i++) cin>>spec[i];
    for(ll i=0;i<m;i++){
        ll u,v,c;
        cin>>u>>v>>c;
        g[u].push_back({v,c});
        g[v].push_back({u,c});
    }
    for(ll i=0;i<k;i++) dijkstra(spec[i],d[i]);
    for(ll mask=1;mask<(1<<k);mask++){
        naj[mask]=10*inf;
        for(ll sred=1;sred<=n;sred++){
            ll tren=0;
            for(ll node=0;node<k;node++) if(mask&(1<<node)) tren+=d[node][sred];
            naj[mask]=min(naj[mask],tren);
        }
    }
    for(ll i=0;i<k*k;i++){
        for(ll mask=1;mask<(1<<k);mask++){
            for(ll mask2=1;mask2<(1<<k);mask2++){
                if((mask&mask2)==0) continue;
                naj[mask|mask2]=min(naj[mask|mask2],naj[mask2]+naj[mask]);
            }
        }
    }
    cout<<naj[(1<<k)-1];
    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...