Cod sursa(job #791243)

Utilizator thesilverhand13FII Florea Toma Eduard thesilverhand13 Data 23 septembrie 2012 15:02:40
Problema Ubuntzei Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.44 kb
 # include <fstream>
 # include <cstring>
 # include <vector>
 # include <algorithm>

 # define dim 2005
 # define pb push_back
 # define inf 9999999999

 using namespace std;

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

 int n, m, k;
 int b[ dim ];
 long long a[ dim ][ dim ];
 int viz[ dim ], c[ dim ];
 long long s = inf, s_int = 0;

 void init()
 {
     int i, j;

     for ( i = 1 ; i <= n ; ++ i )
        for ( j = 1 ; j <= n ; ++ j )
              a[ i ][ j ] = inf;
 }

 void citire()
 {
     int i, x, y, z;

     f >> n >> m;
     f >> k;
     for ( i = 1 ; i <= k ; ++i )
        f >> b[ i ];

     init();

     for ( i = 1 ; i <= m ; ++i )
     {
         f >> x >> y >> z;
         a[ x ][ y ] = z;
         a[ y ][ x ] = z;
         //a[ x ].pb( ( ubuntu ) { y, z } );
        // a[ y ].pb( ( ubuntu ) { x, z } );
     }

     b[ 0 ] = 1;
     b[ k + 1 ] = n;

     c[ 0 ] = 0;
     c[ k + 1 ] = k + 1;

     viz[ 0 ] = 1;
     viz[ k + 1 ] = 1;
 }

 void afisare()
 {
     int i, j;

/*
     for ( i = 1 ; i <= n ; ++ i )
     {
        for ( j = 1 ; j <= n ; ++ j )
           g << a[ i ][ j ] << " ";
        g << "\n";
     }
*/
     g << s;
 }

 void rezolva()
 {
     int i, j, k;

     for ( i = 1 ; i <= n ; ++ i )
        for ( j = 1 ; j <= n ; ++ j )
           for ( k = 1 ; k <= n ; ++ k )
             if ( i != k && j != k && i != j && a[ i ][ j ] > a[ i ][ k ] + a[ k ][ j ] )
                 a[ i ][ j ] = a[ i ][ k ] + a[ k ][ j ];
 }

 inline void back( int x )
 {
     int i;

     if ( x == k + 1  )
     {
         /*for ( int i = 0 ; i <= k + 1 ; i++ )
             g << b[ c[ i ] ]  << " ";
         g << "\n";
         */
         //g << s_int << "\n";
         if ( s > s_int + a[ b[ c[ x - 1 ] ] ][ b[ c[ x ] ] ] )
           s = s_int + a[ b[ c[ x - 1 ] ] ][ b[ c[ x ] ] ];
     }
     else
     {
         for ( i = 1; i <= k  ; ++i )
            if ( viz[ i ] == 0 )
            {
                viz[ i ] = 1;
                c[ x ] = i;
                s_int = s_int + a[ b[ c[ x - 1 ] ] ][ b[ c[ x ] ] ] ;
                // g << s_int << " " << x <<"\n";
                back( x + 1 );
                viz[ i ] = 0;
                s_int = s_int - a[ b[ c[ x - 1 ] ] ][ b[ c[ x ] ] ] ;
            }
     }
 }


 int main()
 {
     citire();
     rezolva();
     back( 1 );
     afisare();
     return 0;
 }