Cod sursa(job #1301705)

Utilizator RaduGabriel2012Dinu Radu RaduGabriel2012 Data 26 decembrie 2014 12:31:04
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define ll long long
#define inf (1LL<<62)
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");

struct muchie
{ int x; ll c; } el,newel;

struct cmp
{
 bool operator() (muchie a,muchie b)
 { return a.c>b.c; }
};

vector <muchie> v[3005];
 int n,m,k,ord[3005],nd[20];
 int dmin[3005],dist[20][20],dp[(1<<17)][17];

priority_queue <muchie,vector<muchie>,cmp> heap;

void Dijkstra(int x,int ind)
{ int i,nod,nod2;

   for(i=1;i<=n;i++)
     dmin[i]=inf;

   dmin[x]=0;

  el.x=x; el.c=0; heap.push(el);

   while(!heap.empty())
   {  el=heap.top(); heap.pop();
      if (dmin[el.x]==el.c)
       { nod=el.x;

          if (ord[nod] && ind!=ord[nod]) dist[ind][ord[nod]]=el.c;

         for(i=0;i<v[nod].size();i++)
         if ((ll)dmin[nod]+v[nod][i].c<dmin[v[nod][i].x])
         {  nod2=v[nod][i].x;
            newel.x=nod2;
            newel.c=(ll)dmin[nod]+v[nod][i].c;
            dmin[nod2]=(ll)dmin[nod]+v[nod][i].c;
            heap.push(newel);
         }

       }
   }
}

int main()
{ int i,j,i2,j2,x,y,nk=0;
    f>>n>>m>>k;
     nd[1]=1; ord[1]=1; nk=1;
    for(i=1;i<=k;i++)
     { nk++;
         f>>nd[nk];
      ord[nd[nk]]=nk;
     }
      nk++; ord[n]=nk;
       nd[nk]=n;
     k=nk;


     //for(i=1;i<=k;i++)
    //   cout<<nd[i]<<" ";


   for(i=1;i<=m;i++)
   {
      f>>x>>y>>el.c;
       el.x=y;
      v[x].push_back(el);
       el.x=x;
      v[y].push_back(el);

   }

  for(i=1;i<=k;i++)
   for(j=1;j<=k;j++)
    dist[i][j]=inf;

   for(i=1;i<=k;i++)
    Dijkstra(nd[i],i);

 for(i=0;i<(1<<k);i++)
  for(j=0;j<k;j++)
    dp[i][j]=inf;

      dp[(1<<0)][0]=0;

    for(i=2;i<(1<<k);i++)
    {

      if (i&(1<<0))
       {

        for(j=1;j<k;j++)
        if (i&(1<<j)  && (i-(1<<j))>0)
         { i2=i-(1<<j);


           for(j2=0;j2<k;j2++)
            if ((i2&(1<<j2)) && j!=j2)
             {
                if (dist[j2+1][j+1]!=inf)
                   dp[i][j]=min((ll)dp[i][j],(ll)dp[i2][j2]+dist[j2+1][j+1]);
             }

         }

       }

    }

 g<<dp[(1<<k)-1][k-1];
    return 0;
}