Pagini recente » Cod sursa (job #3149804) | Cod sursa (job #1054491) | Cod sursa (job #2561369) | Cod sursa (job #1854181) | Cod sursa (job #3198751)
#include <bits/stdc++.h>
#define INF 1000000000
#define DIM 2000
#define E 17
#define pii pair<int,int>
#define pipii pair<int,pii>
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int n,m,k;
int x,y,c;
int v[DIM+5];
vector <pii> L[DIM+5];
int dist[DIM+5][DIM+5];
int d[(1<<(E))+5][DIM+5];
priority_queue <pii,vector<pii>,greater<pii>> q;
void dijkstra(int start){
for(int j=1;j<=n;j++){
dist[start][j] = INF;
}
dist[start][start] = 0;
q.push({0,start});
while(!q.empty()){
int cost = q.top().first;
int nod = q.top().second;
q.pop();
//cout<<cost<<" "<<nod<<" "<<l<<'\n';
if(dist[start][nod] != cost){
continue;
}
for(int i=0;i<L[nod].size();i++){
int vec = L[nod][i].first;
int c = L[nod][i].second;
int newcost = cost + c;
if(dist[start][vec] > newcost){
dist[start][vec] = newcost;
q.push({dist[start][vec],vec});
}
}
}
}
int main(){
f>>n>>m;
f>>k;
for(int i=1;i<=k;i++){
f>>v[i];
}
v[0] = 1;
v[++k] = n;
k++;
for(int i=1;i<=m;i++){
f>>x>>y>>c;
L[x].push_back({y,c});
L[y].push_back({x,c});
}
for(int i=0;i<k;i++){
dijkstra(v[i]);
}
/*for(int i = 0;i<k;i++){
cout<<v[i]<<": ";
for(int j=1;j<=n;j++){
cout<<dist[v[i]][j]<<" ";
}
cout<<'\n';
}*/
for(int mask = 1;mask<(1<<k);mask++){
for(int i=0;i<k;i++){
d[mask][i] = INF;
}
}
d[1][0] = 0;
for(int mask = 1;mask<(1<<k);mask++){
//cout<<mask<<" "<<'\n';
for(int last = 0;last<k;last++){
if(!(mask&(1<<last))){
continue;
}
for(int i = 0;i<k;i++){
if((mask&(1<<i))){
continue;
}
if(d[mask][last] == INF){
continue;
}
int newmask = mask|(1<<i);
if(d[newmask][i] > d[mask][last] + dist[v[i]][v[last]]){
d[newmask][i] = d[mask][last] + dist[v[i]][v[last]];
//cout<<newmask<<" "<<i<<" "<<d[newmask][i]<<'\n';
}
}
}
}
g<<d[(1<<k)-1][k-1];
return 0;
}