Pagini recente » Cod sursa (job #833032) | Cod sursa (job #2938599) | Cod sursa (job #306117) | Cod sursa (job #481317) | Cod sursa (job #2446763)
#include <bits/stdc++.h>
#define MAX 2004
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
typedef pair <int, int> pairINT;
int n,nrc,city[20],dist[MAX][MAX],dp[(1<<16) + 4][20];
bool used[MAX];
vector <pairINT> g[MAX];
set <pairINT> pQ;
void read();
void solve();
void dijkstra(int);
int main(){
read();
solve();
fout<<dp[(1<<nrc)-1][nrc-1];
return 0;
}
void solve(){
int i,j,k;
dijkstra(1);
for(i=0;i<nrc;++i)
dijkstra(city[i]);
city[nrc++]=n;
for(i=1;i<(1<<nrc);++i){
for(j=0;(1<<j)<=i;++j){
if(i & (1<<j)){
if((1<<j) == i){
dp[i][j]=dist[1][city[j]];
break;
}
dp[i][j]=2e9;
for(k=0;(1<<k)<=i;++k){
if(k!=j && ((1<<k) & i))
dp[i][j]=min(dp[i][j], dp[i-(1<<j)][k] + dist[city[k]][city[j]]);
}
}
}
}
}
void dijkstra(int org){
int i,node,d;
memset(used, 0, sizeof used);
for(i=1;i<=n;++i)
dist[org][i]=2e9;
dist[org][org]=0;
pQ.insert({0, org});
while(!pQ.empty()){
d=(*pQ.begin()).first;
node=(*pQ.begin()).second;
pQ.erase(pQ.begin());
used[node]=0;
for(auto it:g[node]){
if(dist[org][it.first] > d + it.second){
if(used[it.first])
pQ.erase(pQ.find({dist[org][it.first], it.first}));
used[it.first]=1;
dist[org][it.first] = d + it.second;
pQ.insert({dist[org][it.first],it.first});
}
}
}
}
void read(){
int i,m,x,y,cost;
fin>>n>>m>>nrc;
for(i=0;i<nrc;++i){
fin>>city[i];
}
for(i=0;i<m;++i){
fin>>x>>y>>cost;
g[x].push_back({y, cost});
g[y].push_back({x, cost});
}
}