Cod sursa(job #1743262)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 17 august 2016 20:49:00
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.59 kb
#include <fstream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;

ofstream g("ubuntzei.out");

long n,k,m,v[20],x,y,uz[20],val,d,mn[2005],mat[20][20],minim,p[20];


struct Heap{
    long nod,val;
};

vector <Heap> H[2005];
vector <Heap> Hp;

long comp(Heap a,Heap b)
{
    return a.val>b.val;
}

void mini(long poz,long nod)
{
    long lg;
    memset(mn,0,sizeof(mn));
    Heap crt;
    crt.nod = nod;
    crt.val = 0;
    Hp.push_back(crt);
    while (!Hp.empty())
    {
        nod = Hp[0].nod;
        lg = Hp[0].val;
        pop_heap(Hp.begin(),Hp.end(),comp);
        Hp.pop_back();

        for (int i=0;i<H[nod].size();i++)
        {
            if (mn[H[nod][i].nod] == 0 || mn[H[nod][i].nod]>H[nod][i].val+lg)
            {
                mn[H[nod][i].nod] = H[nod][i].val+lg;
                Heap crt;
                crt.nod = H[nod][i].nod;
                crt.val = H[nod][i].val+lg;
                Hp.push_back(crt);
                push_heap(Hp.begin(),Hp.end(),comp);
            }
        }
    }
    mat[poz][1] = mn[1];
    mat[poz][k+2] = mn[n];
    for (int i=1;i<=k;i++)
        mat[poz][i+1] = mn[v[i]];
}

void bkt(long k2)
{

    if (k2>k+1)
    {
        if (val+mat[p[k+1]][k+2]<minim || minim==-1)
            minim=val+mat[p[k+1]][k+2];
    }

    else
        for (int i=2;i<=k+1;i++)
        {
            if (uz[i]==0)
            {
                uz[i]=1;
                val = val+mat[p[i-1]][i];
                p[k2] = i;
                if (val>=minim && minim!=-1)
                    return;
                bkt(k2+1);
                val = val-mat[p[i-1]][i];
                uz[i]=0;
            }
        }
}

int main()
{
    freopen("ubuntzei.in","r",stdin);
    scanf("%ld%ld",&n,&m);
    scanf("%ld",&k);

    for (int i=1;i<=k;i++)
        scanf("%ld",&v[i]);

    for (int i=1;i<=m;i++)
    {
        scanf("%ld%ld%ld",&x,&y,&d);

        Heap crt;

        crt.nod = y;
        crt.val = d;
        H[x].push_back(crt);
        crt.nod = x;
        H[y].push_back(crt);
    }

    mini(1,1);

    for (int i=1;i<=k;i++)
        mini(i+1,v[i]);

    mini(k+2,n);

    /*for (int i=1;i<=k+2;i++)
    {
        H[i].clear();
        for (int j=1;i<=k+2;j++)
            if (i!=j)
            {
                Heap crt;
                crt.nod = j;
                crt.val = mat[i][j];
                H[i].push_back(crt);
            }
    }*/

    p[1] = 1;
    minim = -1;
    bkt(2);


    g<<minim;

    return 0;
}