Pagini recente » Cod sursa (job #2720471) | Cod sursa (job #170509) | Cod sursa (job #787391) | Cod sursa (job #2110019) | Cod sursa (job #2698002)
#include <bits/stdc++.h>
#define oo (1 << 30)
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("buntzei.out");
long long int n, m, x, y, cost, p, summin = oo , sum, sum2;
long long int d[2005][2005], v[20], sol[20];
bitset < 2005 > c;
void bkt(int k){
for(int i = 1; i <= p; i++)
if(!c[v[i]]){
sol[k] = v[i];
if(k == 1)
sum += d[1][v[i]];
else
sum += d[v[i - 1]][v[i]];
c[sol[k]] = true;
if(k <= p){
if(k == p)
sum += d[sol[p]][n], summin = min(summin, sum);
else
bkt(k + 1);
}
c[sol[k]] = false;
if(k == 1)
sum -= d[1][sol[k]];
else
sum -= d[sol[k - 1]][sol[k]];
}
}
int main(){
in>>n>>m;
in>>p;
for(int i = 1; i <= p; i++)
in>>v[i];
while(m--){
in>>x>>y>>cost;
d[x][y] = cost;
d[y][x] = cost;
}
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(!d[i][j])
d[i][j] = oo;
for(int k = 1; k <= n; k++)
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(d[i][j] > d[i][k] + d[k][j])
d[i][j] = d[i][k] + d[k][j];
if(!p)
summin = d[1][n];
bkt(1);
out<<summin;
}