Cod sursa(job #2305750)

Utilizator EdgeLordXDOvidiuPita EdgeLordXD Data 20 decembrie 2018 23:15:01
Problema Ubuntzei Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <bits/stdc++.h>
#define N 16
#define NX 2001
#define INF 100000001
#define ll long long
#define f first
#define s second
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
int dp[1<<N][N], C[N][N], n, m, k, v[NX], P[N];
vector< pair<int,int> > a[NX];
priority_queue <pair<int,int> > h;
void dij(){
    int i,j;
    int cur;
    while(!h.empty()){
        i=h.top().s;
        cur=-h.top().f;
        h.pop();
        if(v[i]<0){
            v[i]=-v[i];
            for(auto it:a[i]){
                if(!v[it.s] || cur+it.f<-v[it.s]){
                    h.push({-(cur+it.f), it.s});
                    v[it.s]=-(cur+it.f);
                }
            }
        }
    }
}
int main(){
    int x,y,w,i,j,o;
    in>>n>>m>>k;
    P[1]=1;
    P[2]=n;
    k+=2;
    for(i=3; i<=k; ++i)
        in>>P[i];
    for(i=1; i<=m; ++i){
        in>>x>>y>>w;
        a[x].push_back({w,y});
        a[y].push_back({w,x});
    }
    for(i=1; i<=k; ++i){
        h.push({-1,P[i]});
        v[P[i]]=-1;
        dij();
        for(j=1; j<=k; ++j)
            C[i-1][j-1]=v[P[j]]-1;
        memset(v, 0, sizeof(v));
    }
    for(i=0; i< (1<<k); ++i)
        for(j=0; j<k; ++j)
            if(i&(1<<j))
				for(o=0; o<k; ++o)
                    if((i&(1<<o)) && (o!=j))
                        dp[i][j]=(!dp[i][j] ? dp[i^(1<<j)][o]+C[j][o] : min(dp[i][j], dp[i^(1<<j)][o]+C[j][o]));
    out<<dp[(1<<k)-1][k-1];
    return 0;
}