Cod sursa(job #642804)

Utilizator pbobitzaPirvanescu Livius pbobitza Data 2 decembrie 2011 12:01:42
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <iostream>
#include <fstream>

using namespace std;


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


int t,T[1998],a[2000][2000],d[1998],n,m,costm=15000,n1,n2,sol[1998],j,o=1;


void citesc()
{
    int x,y,c;
    in>>n;
    in>>m;
    in>>t;
    for (int i=1;i<=t;++i)
      in>>T[i];
    for (int i=1;i<=m;++i)
     {
         in>>x;
         in>>y;
         in>>c;
        a[x][y]=c;
        a[y][x]=c;
     }

for (int i=1;i<=n;++i)
  {for (int j=1;j<=n;++j)
    if (a[i][j]==0 && i!=j) a[i][j]=15000;
}





}



void roy_floyd()
{

 for(int k=1;k<=n;k++)
   for (int i=1;i<=n;++i)
         for(int j=1;j<=n;j++)
             a[i][j]=min(a[i][k]+a[k][j],a[i][j]);
}


void distanta()
{
    int dist=0;
    dist=a[1][T[sol[1]]];

    for (int y=1;y<t;++y)
      {
          dist=dist+a[sol[y]][sol[y+1]];
      }

    dist=dist+a[sol[t]][n];
    d[o]=dist;o++;

}


int valid (int k)
{
    int j;
    for (int i=1; i<k; i++)

         if (sol[k]==sol[i]) return 0; return 1;

}

void back(int k)
{

    if (k==t+1)
     {

          distanta();

     }
      else
       {
           sol[k]=0;
           while (sol[k]<t)
            {
                sol[k]++;
                 if ( valid(k) ) back(k+1);
            }
       }
}




int main()

{
int mi;
citesc();
roy_floyd();


j=1;
back(1);
mi=d[1];
for (int i=2;i<o;++i)
  if (d[i]<mi) mi=d[i];

out<<mi;






return 0;

}