Cod sursa(job #1590056)

Utilizator TibixbAndrei Tiberiu Tibixb Data 4 februarie 2016 17:58:11
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.66 kb
#include<fstream>
#include<deque>
#include<cstring>
#include<vector>
#define inf 0x7f7f7f7f
using namespace std;
vector<pair<int, int> > L[2002], L2[20];
deque<int> k;
int n, m, nk, kv[20], x, y, z, nodk, p1, s, h[2002], p[2002], D[20][2002], Dh[1<<16][16], i, nrh, nod, vecin, cost, j, stare, urmstare, sol, nrkv;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
int main()
{
    in>>n>>m;
    in>>nk;
    k.push_back(1);
    kv[++nrkv]=1;
    for(i=1; i<=nk; i++)
    {
        in>>x;
        kv[++nrkv]=x;
        k.push_back(x);
    }
    nk++;
    for(i=1; i<=m; i++)
    {
        in>>x>>y>>z;
        L[x].push_back(make_pair(y, z));
        L[y].push_back(make_pair(x, z));
    }
    while(!k.empty())
    {
        nodk=k.front();
        memset(D[nodk], 127, sizeof(D[nodk]));
        D[nodk][nodk]=0;
        memset(h, 0, sizeof(h));
        memset(p, 0, sizeof(p));
        h[1]=k.front();
        p[h[1]]=1;
        nrh=1;
        k.pop_front();
        while(nrh!=0)
        {
            nod=h[1];
            h[1]=h[nrh];
            p[h[1]]=1;
            nrh--;
            p1=1;
            s=2;
            while(s<=nrh)
            {
                if(s+1<=nrh && D[nodk][h[s+1]]<D[nodk][h[s]])
                    s++;
                if(D[nodk][h[s]]<D[nodk][h[p1]])
                {
                    swap(h[s], h[p1]);
                    p[h[s]]=s;
                    p[h[p1]]=p1;
                    p1=s;
                    s*=2;
                }else
                {
                    break;
                }
            }
            for(i=0; i<L[nod].size(); i++)
            {
                vecin=L[nod][i].first;
                cost=L[nod][i].second;
                if(D[nodk][vecin]>D[nodk][nod]+cost)
                {
                    D[nodk][vecin]=D[nodk][nod]+cost;
                    if(p[vecin]!=0)
                    {
                        s=p[vecin];
                        p1=s/2;
                    }else
                    {
                        h[++nrh]=vecin;
                        p[vecin]=nrh;
                        s=nrh;
                        p1=s/2;
                    }
                    while(p1!=0 && D[nodk][h[s]]<D[nodk][h[p1]])
                    {
                        swap(h[s], h[p1]);
                        p[h[p1]]=p1;
                        p[h[s]]=s;
                        s=p1;
                        p1/=2;
                    }
                }
            }
        }
    }
    for(i=1; i<nk; i++)
    {
        for(j=i+1; j<=nk; j++)
        {
            L2[i-1].push_back(make_pair(j-1, D[kv[i]][kv[j]]));
            L2[j-1].push_back(make_pair(i-1, D[kv[j]][kv[i]]));
        }
    }
    memset(Dh, 127, sizeof(Dh));
    Dh[1][0]=0;
    for(stare=1; stare<(1<<nk); stare++)
    {
        for(nod=0; nod<nk; nod++)
        {
            if(Dh[stare][nod]!=inf)
            {
                for(i=0; i<L2[nod].size(); i++)
                {
                    vecin=L2[nod][i].first;
                    cost=L2[nod][i].second;
                    if((stare&(1<<vecin))==0)
                    {
                        urmstare=stare+(1<<vecin);
                        Dh[urmstare][vecin]=min(Dh[urmstare][vecin], Dh[stare][nod]+cost);
                    }
                }
            }
        }
    }
    sol=inf;
    for(i=1; i<nk; i++)
    {
        sol=min(sol, Dh[(1<<nk)-1][i]+D[kv[i+1]][n]);
    }
    out<<sol;
    return 0;
}