Cod sursa(job #2156525)

Utilizator vladboss2323Ciorica Vlad vladboss2323 Data 8 martie 2018 19:46:48
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.36 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

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

const int N=2005;
const int oo=200000000;
vector <pair <int,int> > a[N];

int n,m,k,dp[18][18],d[N],poz[N],l[16],nh,Dp[1<<18][18];

struct heap
{
    int dist,nod;
};
heap h[N];
void citire()
{
    int x,y,z,i;
    in>>n>>m;
    in>>k;
    for(i=1; i<=k; i++)
        in>>l[i];
    l[0]=1;
    l[k+1]=n;
    //sort(l+1,l+k+1);
    for(i=1; i<=m; i++)
    {
        in>>x>>y>>z;
        a[x].push_back(make_pair(y,z));
        a[y].push_back(make_pair(x,z));
    }
}

void swapp(int i,int j)
{
    swap(h[i],h[j]);
    poz[h[i].nod]=i;
    poz[h[j].nod]=j;
}

void urca(int nod)
{
    while(nod>1 && h[nod].dist < h[nod/2].dist)
    {
        swapp(nod,nod/2);
        nod=nod/2;
    }
}

void coboara(int nod)
{
    int fs=2*nod,fd=2*nod+1,bun=nod;
    if(fs<=nh && h[fs].dist < h[bun].dist)
        bun=fs;
    if(fd<=nh && h[fd].dist < h[bun].dist)
        bun=fd;
    if(bun!=nod)
    {
        swapp(nod,bun);
        coboara(bun);
    }
}

void sterge(int nod)
{
    swapp(nod,nh);
    nh--;
    coboara(nod);
}

void dijkstra(int nr)
{
    int i;
    nh=n;
    for(i=1; i<=n; i++)
        if(i!=nr)
        {
            h[i].dist=oo;
            h[i].nod=i;
        }
    for(i=1; i<=n; i++)
        dp[nr][i]=d[i];
    h[nr].nod=nr;
    h[nr].dist=0;
    urca(nr);
    for(i=1; i<=n; i++)
        poz[i]=i;
    for(i=1; i<=n; i++)
        if(i!=nr)
            d[i]=oo;
    d[nr]=0;
    while(nh > 0)
    {
        int nod=h[1].nod;
        sterge(1);
        for(i=0; i<a[nod].size(); i++)
        {
            int vecin=a[nod][i].first,cost=a[nod][i].second;
            if(d[vecin]>d[nod]+cost)
            {
                d[vecin]=d[nod]+cost;
                h[poz[vecin]].dist=d[vecin];
                h[poz[vecin]].nod=vecin;
                urca(poz[vecin]);
            }
        }
    }
    for(i=1; i<=n; i++)
        if(d[i]==oo)
            d[i]=0;
}

void ciclu()
{
    int q,i,j;
    if(k==0)
    {
        out<<dp[0][k+1]<<" ";
        return;
    }
    k++;
    for(i=1; i<=(1<<k); i++)
        for(j=0; j<k; j++)
            Dp[i][j]=oo;
    Dp[1][0]=0;
    for(i=1; i<(1<<k); i=i+2)
        for(j=0; j<=k; j++)
            if(((1<<j)& i) !=0 )
            {
                for(q=0; q<=k; q++)
                {

                    if(((1<<q) & i) != 0)
                        Dp[i][j]=min(Dp[i][j],Dp[i^(1<<j)][q]+dp[q][j]);
                }
            }
            else
                Dp[i][j]=oo;

}
int main()
{
    int i,j;
    citire();
    for(i=0; i<=k+1; i++)
        for(j=0; j<=k+1; j++)
            dp[i][j]=oo;
    for(i=0; i<=k+1; i++)
    {
        dijkstra(l[i]);
        for(j=0; j<=k+1; j++)
            dp[i][j]=d[l[j]];
    }
   /* for(i=0; i<=k+1; i++)
    {
        for(j=0; j<=k+1; j++)
            out<<dp[i][j]<<" ";
        out<<endl;
    }
    */
    ciclu();
   /* for(i=0; i<=(1<<k); i++)
    {
        for(j=0; j<=n; j++)
            out<<Dp[i][j]<<" ";
               out<<endl;
        }
        */
    int rez=oo;
    for(i=0; i<=k; i++)
    {
        rez=min(rez,Dp[(1<<k)-1][i]+dp[i][k]);
    }
    out<<rez;
    return 0;
}