Cod sursa(job #1300966)

Utilizator RaduGabriel2012Dinu Radu RaduGabriel2012 Data 25 decembrie 2014 12:35:08
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define inf 2147000000
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");

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

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

vector <muchie> v[2005];
 int n,m,k,dmin[2005],ord[2005],dist[18][18],nd[18],dp[(1<<16)];
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 (dmin[nod]+v[nod][i].c<dmin[v[nod][i].x])
         {  nod2=v[nod][i].x;
            newel.x=nod2;
            newel.c=dmin[nod]+v[nod][i].c;
            dmin[nod2]=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);

      dp[1]=0;

    for(i=2;i<(1<<k);i++)
    {  dp[i]=inf;
      for(j=0;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))
             {
                if (dist[j2+1][j+1]!=inf)
                   dp[i]=min(dp[i],dp[i2]+dist[j2+1][j+1]);
             }

        }
    }

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