Cod sursa(job #2038503)

Utilizator Andrei2000Andrei Mihailescu Andrei2000 Data 13 octombrie 2017 18:56:40
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;

typedef pair<int, int> pii;
priority_queue < pii, vector<pii>, greater<pii> > Q;
vector<pii> G[2002];
int n,m,k,d[33000][17],dp[17][33000],v[30000],mini=inf;

void dijkstra(int inode){
    for(int i=1;i<=n;++i)dp[inode][i]=inf;
    Q.push({0,v[inode]});
    dp[inode][v[inode]]=0;
    while(!Q.empty()){
        int node=Q.top().second;
        int dist=Q.top().first;
        Q.pop();
        if(dp[inode][node]<dist)continue;
        dp[inode][node]=dist;
        for(auto edge: G[node]){
            if(dp[inode][edge.first]>dist+edge.second){
                dp[inode][edge.first]=dist+edge.second;
                Q.push({dp[inode][edge.first],edge.first});
            }
        }
    }
}

int gint()
{
    char ch = getchar();
    while(ch < '0' || '9' < ch)
        ch = getchar();

    int x = 0;
    while('0' <= ch && ch <= '9')
    {
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x;
}

int main()
{
    freopen("ubuntzei.in", "r", stdin);
    freopen("ubuntzei.out", "w", stdout);
    int a,b,c;
    n=gint();
    m=gint();
    k=gint();
    for(int i=1;i<=k;++i)
            v[i]=gint();
    for(int i=1;i<=m;++i){
        a=gint();
        b=gint();
        c=gint();
        G[a].push_back({b,c});
        G[b].push_back({a,c});
    }
    for(int i=1;i<=k;++i)
            dijkstra(i);
    v[0]=1;
    dijkstra(0);
    memset(d,inf,sizeof d);
    /*for(int msk=1;msk< (1<<k);++msk){
        if(!(msk & (msk-1))){
            for(int i=0;i<k;++i)
                if(msk==(1<<i))
                    d[msk][i]=dp[0][v[i+1]];
            continue;
        }
        for(int i=0;i<k;++i)
            for(int j=0;j<k;++j)
                if(msk&(1<<i) && msk&(1<<j))
                    d[msk][i]=min(d[msk][i],d[msk-(1<<i)][j]+dp[j+1][v[i+1]]);
    }*/
    if(!k){
        printf("%d\n", dp[0][n]);
        return 0;
    }
    for(int i=0;i<k;++i)
        mini=min(mini,d[(1<<k)-1][i]+dp[i+1][n]);
    printf("%d\n", mini);
    return 0;
}