Cod sursa(job #2138276)

Utilizator brczBereczki Norbert Cristian brcz Data 21 februarie 2018 15:18:21
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include<bits/stdc++.h>

using namespace std;

ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");

#define cin fin
#define cout fout

int dist[2005][2005];
vector<pair<int,int> > g[2005];
priority_queue<pair<int,int> ,vector<pair<int,int> > ,greater<pair<int,int> > > H;
int N,M,K;
int dp[1<<15][17];
int ks[20];

int main()
{
    cin >> N >> M >> K;
    for(int i=1;i<=K;i++) cin >> ks[i];
    for(int i=1;i<=M;i++)
    {
        int x,y,z;
        cin >> x >> y >> z;
        g[x].push_back({y,z});
        g[y].push_back({x,z});
    }
    ks[0]=1;
    ks[K+1]=N;
    for(int i=0;i<=K+1;i++)
    {
        for(int j=1;j<=N;j++)dist[ks[i]][j]=1<<28;
        dist[ks[i]][ks[i]]=0;
        H.push({0,ks[i]});
        ///cout<<i<<"\n";
        while(!H.empty())
        {
            int nod=H.top().second;
            int cost=H.top().first;
            H.pop();
            if(cost!=dist[ks[i]][nod])continue;
            for(auto it:g[nod])
                if(dist[ks[i]][it.first]>dist[ks[i]][nod]+it.second)
                {
                    dist[ks[i]][it.first]=dist[ks[i]][nod]+it.second;
                    H.push({dist[ks[i]][it.first],it.first});
                }
        }
    }
    if(!K)
    {
        cout << dist[1][N] << '\n';
        return 0;
    }
    for(int i=0;i<(1<<K);i++)for(int j=0;j<=K;j++)dp[i][j]=1<<28;
    for(int i=1;i<=K;i++)
    {
        dp[1<<(i-1)][i]=dist[1][ks[i]];
    }
    for(int i=2;i<(1<<K);i++)
    {
        for(int j=1;j<=K;j++)
        {
            if((i>>(j-1))&1)
            {
                for(int k=1;k<=K;k++)
                {
                    dp[i][j]=min(dp[i][j],dp[i^(1<<(j-1))][k]+dist[ks[k]][ks[j]]);
                }
            }
        }
    }
    int rez=1<<28;
    for(int i=1;i<=K;i++)rez=min(rez,dp[(1<<K)-1][i]+dist[ks[i]][N]);

    cout << rez << '\n';
    return 0;
}