Pagini recente » Cod sursa (job #1222407) | Cod sursa (job #900789) | Cod sursa (job #528657) | Cod sursa (job #528655) | Cod sursa (job #2856981)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
const int N=2e3+1;
const int K=15;
const int inf=1e9;
int n,m,k,np;
int c[K+2][K+2],d[1<<(K+2)][K],p[K+2],poz[N+1],dist[N+1];
vector <pair<int,int>> a[N+1];
priority_queue <pair<int,int>> h;
void dijkstra(int nod){
for(int i=1; i<=n; i++)
dist[i]=inf;
bitset <N+1> selectat;
dist[nod]=0;
h.push({0,nod});
while(!h.empty()){
int x=h.top().second;
h.pop();
if(selectat[x])
continue;
selectat[x]=1;
for(auto p:a[x]){
int y=p.first;
int c=p.second;
if(dist[x]+c<dist[y]){
dist[y]=dist[x]+c;
h.push({-dist[y],y});
}
}
}
int pnod=poz[nod];
for(int i=0; i<np; i++)
c[pnod][i]=c[i][pnod]=dist[p[i]];
}
int hamilton(){
for(int i=0; i<(1<<np); i++){
for(int j=0; j<np; j++)
d[i][j]=inf;
}
d[1][0]=0;
for(int i=1; i<(1<<np); i+=2){
for(int j=0; j<np; j++){
if((i & (1<<j))&& d[i][j]!=inf){
for(int k=0; k<np; k++){
int x=(i | (1<<k));
d[x][k]=min(d[x][k], d[i][j]+c[j][k]);
}
}
}
}
return d[(1<<np)-1][np-1];
}
int main()
{
f>>n>>m>>k;
p[np++]=1;
poz[1]=0;
for(int i=0; i<k; i++){
f>>p[np++];
poz[p[np-1]]=np-1;
}
p[np++]=n;
poz[n]=np-1;
for(int i=0; i<m; i++){
int x,y,c;
f>>x>>y>>c;
a[x].push_back({y,c});
a[y].push_back({x,c});
}
for(int i=0; i<np; i++)
dijkstra(p[i]);
g<<hamilton();
return 0;
}