Cod sursa(job #2101061)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 6 ianuarie 2018 19:22:29
Problema Ubuntzei Scor 80
Compilator cpp Status done
Runda long_challenge Marime 1.7 kb
#include <bits/stdc++.h>
#define Nmax 2002
#define pii pair<int,int>
using namespace std;

ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");

int D[16][Nmax],p[Nmax],n,k,m,x,y,c,DP[65537][16],mx;
bool uz[Nmax];
vector<pii> H;
vector<pii> v[Nmax];

bool comp(pii a,pii b) {return a.second>b.second;}

void make_bst(int fst,int poz)
{
    H.push_back({fst,0});
    D[poz][fst] = 0;
    while (!H.empty())
    {
        int nod = H[0].first;
        int val = H[0].second;
        pop_heap(H.begin(),H.end(),comp);
        H.pop_back();
        if (D[poz][nod]<val)
            continue;
        for (auto it : v[nod])
            if (D[poz][it.first]>val+it.second)
            {
                D[poz][it.first] = val+it.second;
                H.push_back({it.first,val+it.second});
                push_heap(H.begin(),H.end(),comp);
            }
    }
}

int main()
{
    f>>n>>m;
    f>>k;
    for (int i=1;i<=k;i++)
        f>>p[i];
    for (int i=1;i<=m;i++)
    {
        f>>x>>y>>c;
        v[x].push_back({y,c});
        v[y].push_back({x,c});
    }

    memset(D,0x3f,sizeof(D));
    make_bst(1,0);

    for (int i=1;i<=k;i++)
        make_bst(p[i],i);

    mx = (1<<k);
    memset(DP,0x3f,sizeof(DP));

    for (int i=1;i<=k;i++)
        DP[1<<(i-1)][i] = D[0][p[i]];
    for (int i=0;i<mx;i++)
        for (int s=1;s<=k;s++)
            if ((i&(1<<(s-1)))!=0)
                for (int j=1;j<=k;j++)
                    if ((i&(1<<(j-1)))==0)
                        DP[i+(1<<(j-1))][j] = min(DP[i+(1<<(j-1))][j],DP[i][s]+D[s][p[j]]);
    int mn = 2e9;
    for (int i=1;i<=k;i++)
        mn = min(mn,DP[mx-1][i]+D[i][n]);

    g<<mn;

    return 0;
}