Pagini recente » Cod sursa (job #2072007) | Cod sursa (job #146519) | Cod sursa (job #1584021) | Cod sursa (job #3209979) | Cod sursa (job #791243)
Cod sursa(job #791243)
# 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;
}