Cod sursa(job #2041418)

Utilizator FredyLup Lucia Fredy Data 17 octombrie 2017 11:31:39
Problema Ubuntzei Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <fstream>
#include <algorithm>
#include <queue>
#include <vector>

using namespace std;

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

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

int main()
{
    int aa,bb,cc;
    fin>>n>>m>>k;
    for (int i=1; i<=k; i++)
        fin>>o[i];
    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]});
        ///cout<<i<<"\n";
        while(!PQ.empty())
        {
            int nod=PQ.top().second;
            int cost=PQ.top().first;
            PQ.pop();
            if (path[o[i]][nod]!= cost) continue;
            for (auto it:G[nod])
                if (path[o[i]][it.first] > path[o[i]][nod] + it.second)
                {
                    path[o[i]][it.first] = path[o[i]][nod] + 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 j=1; j<=k; j++)
            if ((mask>>(j-1))&1)
                for (int kk=1; kk<=k; kk++)
                {
                    dp[mask][j] = min (dp[mask][j] , dp[mask^(1<<(j-1))][kk] + path[o[kk]][o[j]]);
                }



    int rez=inf;
    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;
}