Pagini recente » Cod sursa (job #605652) | Cod sursa (job #2292281) | Cod sursa (job #1079775) | Cod sursa (job #961159) | Cod sursa (job #2301861)
#include <bits/stdc++.h>
#define INF 2000000000
std::priority_queue <std::pair<int, int> > pq;
std::vector <std::pair<int, int> > graph[2001];
int dist[2001][2001], v[20], ;
bool folosit[2001];
int minim(int a, int b){
if(a<b)
return a;
return b;
}
int main(){
FILE *fin, *fout;
int n, k, rsp, m, i, nr, a, b, c, x, y, ii, jj, j, dx, dxy, iii;
fin=fopen("ubuntzei.in", "r");
fout=fopen("ubuntzei.out", "w");
fscanf(fin, "%d%d%d", &n, &m, &k);
for(i=0;i<k;i++)
fscanf(fin, "%d", &v[i+1]);
for(i=0;i<m;i++){
fscanf(fin, "%d%d%d", &a, &b, &c);
graph[a].push_back({c, b});
}
for(iii=1;iii<=k;iii++){
ii=v[iii];
for(i=1;i<=n;i++)
dist[ii][i]=INF;
dist[ii][ii]=0;
pq.push({-dist[ii][ii], 1});
while(!pq.empty()){
while(!pq.empty() && folosit[pq.top().second])
pq.pop();
if(!pq.empty()){
dx=-pq.top().first;
x=pq.top().second;
folosit[x]=1;
for(i=0;i<graph[x].size();i++){
dxy=graph[x][i].first;
y=graph[x][i].second;
if(dist[ii][x]+dxy<dist[ii][y]){
dist[ii][y]=dist[ii][x]+dxy;
pq.push({-dist[ii][y], y});
}
}
}
}
}
for(i=1;i<(1<<k);i++)
for(j=1;j<=k;j++)
d[i][j]=INF;
for(i=3;i<(1<<k);i+=2){
for(j=1;j<=k;j++){
ii=i^(1<<j);
for(jj=1;jj<=k;jj++)
if((1<<jj&&ii && jj!=j)
d[i][j]=minim(d[i][j], d[ii][jj]+dist[v[jj]][j]);
}
}
mini=INF;
for(i=1;i<=n;i++)
if(mini>d[(1<<n)-1][i]+dist[i][0])
mini=d[(1<<n)-1][i]+dist[i][0];
fprintf(fout, "%d", mini);
fclose(fin);
fclose(fout);
return 0;
}