Cod sursa(job #886739)

Utilizator UgleaEduFMI - Edward UgleaEdu Data 23 februarie 2013 10:47:56
Problema Ubuntzei Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
long int i, j, k, c[2001][2001], n, m, v[2001], st[2001], nrp, s, mini = 10000, h;
void init()
{
 for( i = 1; i <= n; i++ )
  for( j = 1; j <= n; j++ )
   if ( i == j )
    c[i][j] = 0;
   else
    c[i][j] = 10000;
}
void rez()
{
 for( k = 1; k <= n; k++ )
  for ( i = 1; i <= n; i++ )
   for ( j = 1; j <= n; j++ )
    if( c[i][j] > c[i][k] + c[k][j] )
     c[i][j] = c[i][k] + c[k][j];
}
void initial ()
{ st[k] = 0; }
int succesor()
{
 if ( st[ k ] < nrp )
 {
  st[k]++;
  return 1;
 }
 return 0;
}
int valid()
{
 for( i = 1; i < k; i++ )
  if ( st[i] == st[k] )
   return 0;
 return 1;
}
int solutie()
{ return k == nrp; }
void permutari()
{
 s = 0;
 s += c[1][v[st[1]]];
 for ( h = 1; h < nrp; h++ )
  s += c[v[st[h]]][v[st[h+1]]];
 s += c[v[st[h]]][n];
 if( s < mini )
  mini = s;
}
void back()
{
 int as, ev;
 k = 1;
 initial();
 while( k > 0 )
 {
  as = 1;
  ev = 0;
  while( as && !ev )
  {
   as = succesor();
   if ( as )
    ev = valid();
  }
  if ( as )
    if ( solutie () )
     permutari();
    else
    { k++; initial(); }
   else
    k--;
 }
}
int main()
{
 int x, y;
 f>>n>>m;
 f>>nrp;
 for( i = 1; i <= nrp; i++ )
  f>>v[i];
 init();
 for( i = 1; i <= m; i++ )
 {
  f>>x>>y;
  f>>c[x][y];
  c[y][x] = c[x][y];
 }
 rez();
 back();
 g<<mini;



 return 0;
}