Pagini recente » Cod sursa (job #1942925) | Cod sursa (job #1888588) | Cod sursa (job #2956963) | Cod sursa (job #69829) | Cod sursa (job #1121576)
#include <cstdio>
#include <vector>
#include <map>
#include <set>
#include <algorithm>
#define NMax 2001
#define Inf 1<<30
using namespace std;
long n, m, k, x, y, z, now, nr, minNr;
long a[21], b[21], cost[21][NMax], v[21][21];
vector<pair<long, long> > edge[NMax];
bool viz[21];
set<set<long> > SetsBySize[21];
map<set<long>, long> mp[21];
set<long> st, all, lipsa;
void computeMinimalRoadFrom ( long ind, long now ) {
set<pair<long, long> > q;
for ( long i = 1; i <= n; i++ )
cost[ind][i] = Inf;
q.insert ( make_pair ( 0, now ) );
cost[ind][now] = 0;
while ( !q.empty ( ) ) {
now = q.begin ( )->second;
q.erase ( q.begin ( ) );
for ( long i = 0; i < edge[now].size ( ); i++ )
if ( cost[ind][now] + edge[now][i].second < cost[ind][edge[now][i].first] )
cost[ind][edge[now][i].first] = cost[ind][now] + edge[now][i].second,
q.insert ( make_pair ( cost[ind][edge[now][i].first], edge[now][i].first ) );
}
}
void bkt ( );
int main()
{
freopen ( "ubuntzei.in", "r", stdin );
freopen ( "ubuntzei.out", "w", stdout );
scanf ( "%ld %ld %ld", &n, &m, &k );
for ( long i = 1; i <= k; i++ )
scanf ( "%ld", &a[i] );
for ( long i = 1; i <= m; i++ )
scanf ( "%ld %ld %ld", &x, &y, &z ),
edge[x].push_back ( make_pair ( y, z ) ),
edge[y].push_back ( make_pair ( x, z ) );
a[0] = 1;
a[k + 1] = n;
for ( long i = 0; i <= k + 1; i++ )
computeMinimalRoadFrom ( i, a[i] );
if ( k == 0 )
minNr = cost[0][n];
else
bkt ( );
printf ( "%ld\n", minNr );
return 0;
}
void bkt ( ) {
for ( long j = 1; j <= k; j++ ) {
all.insert ( j );
st.clear ( ); st.insert ( j );
SetsBySize[1].insert ( st );
mp[j][st] = cost[0][a[j]];
}
for ( long l = 1; l < k; SetsBySize[l].clear ( ), l++ )
for ( set<set<long> >::iterator it = SetsBySize[l].begin ( ); it != SetsBySize[l].end ( ); it++ ) {
lipsa.clear ( );
set_difference ( all.begin ( ), all.end ( ), it->begin ( ), it->end ( ), inserter ( lipsa, lipsa.end ( ) ) );
for ( set<long>::iterator j = it->begin ( ); j != it->end ( ); j++ )
for ( set<long>::iterator i = lipsa.begin ( ); i != lipsa.end ( ); i++ ) {
st = *it; st.insert ( *i );
nr = mp[*j][*it] + cost[*j][a[*i]];
if ( nr < mp[*i][st] || mp[*i][st] == 0 )
mp[*i][st] = nr,
SetsBySize[l + 1].insert ( st );
}
}
minNr = Inf;
for ( set<set<long> >::iterator it = SetsBySize[k].begin ( ); it != SetsBySize[k].end ( ); it++ ) {
for ( set<long>::iterator j = it->begin ( ); j != it->end ( ); j++ )
nr = mp[*j][*it] + cost[*j][a[k+1]];
if ( nr < minNr )
minNr = nr;
}
}