Pagini recente » Cod sursa (job #2044797) | Cod sursa (job #1183943) | Cod sursa (job #350897) | Cod sursa (job #2816362) | Cod sursa (job #2713768)
#include <iostream>
#include <fstream>
#include <vector>
#include<queue>
using namespace std;
const int inf=1<<30;
int dp[131072][18];
int dist[2006][2006];
int l[20001];
vector<pair<int, int> > v[20001];
int main() {
int n, m, i, j, x, y, c, k;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
fin>>n>>m;
fin>>k;
l[0]=1;
l[k+1]=n;
for(i=1;i<=k;i++) {
fin>>l[i];
}
for(i=1; i<=m; i++) {
fin>>x>>y>>c;
v[y].push_back({x, c});
v[x].push_back({y, c});
}
for(i=0;i<=k+2;i++) {
for(j=0;j<=n+1;j++) {
dist[i][j]=inf;
}
}
for(i=0;i<=1<<(k+2);i++) {
for(j=0;j<k+2;j++) {
dp[i][j]=inf;
}
}
priority_queue<pair<int, int> >h;
for(i=0;i<=k+1;i++) {
dist[i][l[i]]=0;
h.push({l[i], 0});
while(!h.empty()) {
int nod=h.top().first;
h.pop();
for(int j=0;j<v[nod].size();j++) {
int newn=v[nod][j].first;
int cost=v[nod][j].second;
if(cost+dist[i][nod]<dist[i][newn]) {
dist[i][newn]=cost+dist[i][nod];
h.push({newn, -dist[i][newn]});
}
}
}
for(int po=1;po<=n;po++) {
cout<<dist[i][po]<<" ";
}
}
dp[1][0] = 0;
int mask;
for(mask=0; mask<(1<<k+2); mask++) {
for(i=0; i<=k+1; i++) {
if(mask&(1<<i)==0) continue;
for(int t=0;t<=k+1;t++) {
if(mask&(1<<t)==0) continue;
dp[mask|(1<<t)][t]=min(dp[mask|(1<<t)][t], dp[mask][i]+dist[i][l[t]]);
}
}
}
fout<<dp[(1<<(k+2))-1][k+1];
return 0;
}