Cod sursa(job #2039651)

Utilizator FredyLup Lucia Fredy Data 14 octombrie 2017 19:05:43
Problema Ubuntzei Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <fstream>
#include <vector>
#include <queue>
#include <iostream>

using namespace std;

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

#define lim 2010
#define inf 2e9
int n,m;
vector < pair<int,int> > G[lim];
int o[20],k,path[20][lim];
priority_queue < pair<int,int> > PQ;
int dp[1<<18][18];

int main()
{
    int aa,bb,cc;
    fin>>n>>m;
    fin>>k;
    for (int i=1; i<=k; i++)    fin>>o[k];
    for (int i=1; i<=m; i++)
    {
        fin>>aa>>bb>>cc;
        G[aa].push_back({bb,cc});
        G[bb].push_back({aa,cc});
    }
    o[0]=1, o[k+1]=n;
    for (int i=0; i<=k+1; i++)
    {
        for (int j=1; j<=n; j++)    path[o[i]][j]=inf;
        path[o[i]][o[i]]=0;
        PQ.push({0,o[i]});
        while (!PQ.empty())
        {
            int act=PQ.top().second, cost=-PQ.top().first;
            PQ.pop();
            if (path[o[i]][act]!=cost)  continue;
            for (auto it:G[act])
                if (path[o[i]][it.first] > path[o[i]][act]+it.second)
                {
                    path[o[i]][it.first] = path[o[i]][act]+it.second;
                    PQ.push({-path[o[i]][it.first],it.first});
                }
        }
    }

    if (k==0)
    {
        fout<<path[1][n];
        return 0;
    }

    for (int i=0; i<(1<<k); i++)
        for (int j=0; j<=k; j++)
            dp[i][j]=inf;
    for (int i=1; i<=k; i++)    dp[1<<(i-1)][i]=path[1][o[i]];

    for (int mask=2; mask<(1<<k); mask++)
        for (int i=1; i<=k; i++)
            if (mask&(i<<(i-1)))
                for (int j=1; j<=k; j++)
                    dp[mask][i] = min (dp[mask][i], dp[mask^(1<<(i-1))][k]+path[o[j]][o[i]]);

    int rez=1<<28;
    for (int i=1; i<=k; i++)
        rez = min (rez, dp[(1<<k)-1][i]+path[o[i]][n]);
    fout<<rez;
    fin.close();
    fout.close();
    return 0;
}