Cod sursa(job #2305592)

Utilizator EdgeLordXDOvidiuPita EdgeLordXD Data 20 decembrie 2018 17:10:50
Problema Ubuntzei Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.84 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 M=1;
int dp[1<<N][NX], r[N][N], C[NX][NX], P[N], nr2[N], n, m, k;
bool v[NX], p[NX];
int a[NX][NX], nr[NX], c[NX][NX];
pair<int,int> h[NX*NX];
void dij(int o){//cout<<o<<": \n";
    int i,j,k=0;
    int cur;
    while(h[0].f!=-M){
        i=h[0].s;
        cur=-h[0].f;
        h[0].f=-M;
        pop_heap(h, h+k+1);
        while(!v[i]){// cout<<i<<" "<<cur<<"\n";
            v[i]=1;
            if(p[i] && !C[i][o] && i!=o){
                r[o][++nr2[o]]=i;
                r[i][++nr2[i]]=o;
                C[o][i]=C[i][o]=cur;
            }
            for(j=1; j<=nr[i]; ++j){
                if(!v[a[i][j]]){
                    h[++k].f=-(cur+c[i][a[i][j]]*1LL);
                    h[k].s=a[i][j];
                    push_heap(h,h+k+1);
                }
            }
        }
    }
}
int main(){
    int x,y,w,i,j,o;
    in>>n>>m>>k;
    P[1]=1;
    P[2]=n;
    p[1]=p[n]=1;
    k+=2;
    for(i=3; i<=k; ++i)
        in>>P[i], p[P[i]]=1;
    for(i=1; i<=m; ++i){
        in>>x>>y>>w;
        a[x][++nr[x]]=y;
        a[y][++nr[y]]=x;
        c[x][y]=c[y][x]=w;
        M+=w*2;
    }
    for(i=1; i<=k; ++i){
        h[0].f=0;
        h[0].s=P[i];
        dij(P[i]);
        for(j=1; j<=n; ++j)
            v[j]=0;
    }
    for(i=0; i< (1<<k); ++i)
        for(j=0; j<k; ++j)
            if(i&(1<<j))
				for(o=1; o<=nr2[P[j+1]]; ++o)
                    if(i&(1<<r[P[j+1]][o]))
                        dp[i][j]=(!dp[i][j] ? dp[i^(1<<j)][r[P[j+1]][o]]+C[P[j+1]][r[P[j+1]][o]] : min(dp[i][j], dp[i^(1<<j)][r[P[j+1]][o]]+C[P[j+1]][r[P[j+1]][o]]));
    out<<dp[(1<<k)-1][k-1];
    return 0;
}