Pagini recente » Cod sursa (job #2138504) | Cod sursa (job #2561499) | Cod sursa (job #2282637) | Cod sursa (job #893169) | Cod sursa (job #2481249)
#include <bits/stdc++.h>
#define nmax 2005
#define smax 32770
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
int n,m,k,prt[nmax],d[nmax],dp[22][22];
bool processed[nmax];
vector <pair<int,int> > lista[nmax];
void read(){
in >> n >> m;
in >> k;
prt[0]=1;
prt[k+1]=n;
for(int i=1; i<=k; i++){
in >> prt[i];
}
for(int i=1; i<=m; i++){
int x,y,cost;
in >> x >> y >> cost;
lista[x].push_back({y,cost});
lista[y].push_back({x,cost});
}
}
priority_queue < pair<int,int> > pq;
void dijkstra(int node){
for(int i=1; i<=n; i++){
d[i]=INT_MAX;
}
d[node]=0;
pq.push({0,node});
memset(processed,0,sizeof(processed));
while(!pq.empty()){
int nod = pq.top().second;
int dist = -pq.top().first;
pq.pop();
if(processed[nod]) continue;
processed[nod]=1;
for(auto x:lista[nod]){
int vecin = x.first;
int cost = x.second;
if(d[vecin] > cost + dist){
d[vecin] = cost + dist;
pq.push({-d[vecin],vecin});
}
}
}
}
void precalc()
{
for(int i=0; i<=k+1; i++){
dijkstra(prt[i]);
for(int j=0; j<=k+1; j++){
dp[i][j]=d[prt[j]];
}
}
}
bool done[17][(1<<17)];
int v[17][(1<<17)];
priority_queue <pair<int,pair<int,int> > > q;
void dijkstra2(){
for(int i=0; i<=k+1; i++){
for(int j=0; j<(1<<(k+2)); j++){
v[i][j]=INT_MAX;
}
}
v[0][1]=0;
q.push({0,{0,1}});
while(!q.empty()){
int val = -q.top().first;
int node = q.top().second.first;
int masca = q.top().second.second;
q.pop();
if(done[node][masca]) continue;
done[node][masca]=1;
if(node == k+1 && masca == (1<<(k+2))-1){
out << v[node][masca] << '\n';
return;
}
for(int i=0; i<=k+1; i++){
if(i==node) continue;
int masca_noua = (masca|(1<<i));
if(v[i][masca_noua] > val+dp[node][i]){
v[i][masca_noua] = val+dp[node][i];
q.push({-v[i][masca_noua],{i,masca_noua}});
}
}
}
}
int main()
{
read();
precalc();
dijkstra2();
}