Pagini recente » Cod sursa (job #2499105) | Cod sursa (job #493138) | Cod sursa (job #1439495) | Cod sursa (job #1520626) | Cod sursa (job #2563134)
#include <bits/stdc++.h>
#define MOD 104659
#define ull unsigned long long
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
//nu trebuie ca graful sa fie restrans pt ca| dinamica iti da cel mai ieftin lant hamiltonian,indiferent de ce alte contexiuni in plus ai avea care contin nodurile din k intermediare
vector<pair<int,int>> G[2005];
priority_queue<pair<int,int>> Q;
int G2[20][20], DP[131172][20];
int k[30],val[2005], frk[2005], viz[2005];
int n,m,c;
const int inf = 2000000005;
void Dijkstra(int start){
int i,vecin,cost,dist,nod;
for(i = 1; i <= n; i++){
val[i] = inf;
viz[i] = 0;
}
while(!Q.empty()){
Q.pop();
}
Q.push(make_pair(0,start));
val[start] = 0;
while(!Q.empty()){
nod = Q.top().second;
dist = -Q.top().first;
viz[nod] = 1;
Q.pop();
for(i = 0 ; i < G[nod].size(); i++){
vecin = G[nod][i].first;
cost = G[nod][i].second;
if(val[vecin] > dist+cost){
val[vecin] = dist+cost;
Q.push(make_pair(-val[vecin],vecin));
}
}
if(!(!frk[nod] || nod == start)){
G2[frk[start]-1][frk[nod]-1] = val[nod];
}
while(!Q.empty() && viz[Q.top().second]){
Q.pop();
}
}
}
int main()
{
int i,j,a,b,cost,l;
fin>>n>>m>>c;
k[1] = 1;
frk[1] = 1;
for(i = 2; i <= c+1; i++){
fin>>k[i];
frk[k[i]] = i;
}
k[c+2] = n;
frk[n] = c+2;
c+=2;
for(i = 1; i <= m; i++){
fin>>a>>b>>cost;
G[a].push_back(make_pair(b,cost));
G[b].push_back(make_pair(a,cost));
}
for(i = 1; i <= c; i++){
Dijkstra(k[i]);
}
for(i = 0; i < 1<<c; i++){
for(j = 0; j < c; j++){
DP[i][j] = inf;
}
}
DP[1][0] = 0;
for(i = 1; i < 1<<c; i++){
for(j = 0; j < c; j++){
if(i&(1<<j)){
for(l = 0; l < c; l++){
if(i&(1<<l) && l != j){
DP[i][j] = min(DP[i][j], DP[i-(1<<j)][l] + G2[j][l]);
}
}
}
}
}
fout<<DP[(1<<c)-1][c-1]<<'\n';
return 0;
}