Pagini recente » Cod sursa (job #2023692) | Profil M@2Te4i | Cod sursa (job #11518) | Cod sursa (job #3204766) | Cod sursa (job #3193206)
#include <bits/stdc++.h>
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
const int NMAX = 2001;
const int INF = 2e9;
vector <pair<int, int>> adj[NMAX + 1];
priority_queue <pair<int, int>, vector <pair<int, int>>, greater <pair<int, int>>> pq;
int dist[20][NMAX];
int loc[20];
int n, m;
void djk( int s ){
for(int i = 1; i <= n; i++)
dist[s][i] = INF;
dist[s][loc[s]] = 0;
pq.push({dist[s][loc[s]], loc[s]});
while(!pq.empty()){
int nod = pq.top().second;
pq.pop();
for(auto vec : adj[nod]){
if( dist[s][vec.first] > dist[s][nod] + vec.second){
dist[s][vec.first] = dist[s][nod] + vec.second;
pq.push({dist[s][vec.first], vec.first});
}
}
}
}
struct Radu{
int next, costmuchie;
};
vector <Radu> g[NMAX];
int dp[(1<<17) + 1][NMAX];
int main()
{
int k;
in >> n >> m >> k;
for( int i = 1; i <= k; i++ )
in >> loc[i];
loc[0] = 1;
loc[k+1] = n;
for( int i = 0; i < m; i++ ){
int a, b, c;
in >> a >> b >> c;
adj[a].push_back({b, c});
adj[b].push_back({a, c});
}
for( int i = 0; i <= k+1; i++ )
djk(i);
for( int config = 1; config < (1 << (k+2)); config++ )
for( int curnode = 0; curnode <= k+1; curnode++ )
dp[config][curnode] = INF;
dp[1][0] = 0;
for( int config = 1; config < (1 << (k+2)); config++ ){
for( int curnode = 0; curnode <= k+1; curnode++ ){
if( ( config & (1 << curnode)) == 0 || dp[config][curnode] == INF)
continue;
for( int i = 0; i <= k+1; i++ ){
if( (config & (1 << i)) == 0 )
dp[config | (1 << i)][i] = min( dp[config | (1 << i)][i],
dp[config][curnode] + dist[curnode][loc[i]]);
}
}
}
out << dp[(1<<(k+2))-1][k+1];
return 0;
}