Pagini recente » Cod sursa (job #1929893) | Cod sursa (job #2227701) | Cod sursa (job #162071) | Cod sursa (job #227901) | Cod sursa (job #1501615)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
#define Nmax 2002
#define Cmax 65540
#define Kmax 20
#define inf 0x3f3f3f3f
FILE *f = fopen ( "ubuntzei.in", "r" );
FILE *g = fopen ( "ubuntzei.out", "w" );
int N, M, K, Dist[Kmax][Nmax], D[Cmax][Kmax], v[Kmax];
priority_queue < pair < int, int > > Heap;
vector < pair < int , int > > G[Nmax];
void Dijktrsa ( int ind, int start ){
for ( int i = 1; i <= N; ++i )
Dist[ind][i] = inf;
Dist[ind][start] = 0;
Heap.push ( make_pair ( 0, start ) );
vector < pair < int , int > > :: iterator it;
while ( !Heap.empty() ){
int nod = Heap.top().second;
Heap.pop();
for ( it = G[nod].begin(); it < G[nod].end(); ++it ){
int now = it -> first;
int cost = it -> second;
if ( Dist[ind][now] > Dist[ind][nod] + cost ){
Dist[ind][now] = Dist[ind][nod] + cost;
Heap.push ( make_pair ( -Dist[ind][now], now ) );
}
}
}
}
int main(){
fscanf ( f, "%d%d%d", &N, &M, &K );
v[0] = 1;
for ( int i = 1; i <= K; ++i )
fscanf ( f, "%d", &v[i] );
int x, y, c;
for ( int i = 1; i <= M; ++i ){
fscanf ( f, "%d%d%d", &x, &y, &c );
G[x].push_back ( make_pair ( y, c ) );
G[y].push_back ( make_pair ( x, c ) );
}
K++;
for ( int i = 0; i < K; ++i )
Dijktrsa( i, v[i] );
memset ( D, inf, sizeof ( D ) );
D[1][0] = 0;
for ( int i = 1; i < ( 1 << K ); ++i ){
for ( int j = 0; j < K; ++j ){
if ( i & ( 1 << j ) ){
for ( int k = 0; k < K; ++k ){
if ( k != j && ( i & ( 1 << k ) ) )
D[i][j] = min ( D[i][j], D[i^(1<<j)][k] + Dist[k][v[j]] );
}
}
}
}
int Sol = inf;
for ( int i = 0; i < K; ++i )
Sol = min ( Sol, D[(1<<K)-1][i] + Dist[i][N] );
fprintf ( g, "%d", Sol );
return 0;
}