Cod sursa(job #642817)

Utilizator pbobitzaPirvanescu Livius pbobitza Data 2 decembrie 2011 12:38:59
Problema Ubuntzei Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 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[T[sol[y]]][T[sol[y+1]]];


    dist=dist+a[T[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();

if (t!=0) {back(1);
mi=30000;
for (int i=1;i<o;++i)
  if (d[i]<mi) mi=d[i];
//out<<d[i]<<" ";
out<<mi;}

else out<<a[1][n];






return 0;

}