Pagini recente » Cod sursa (job #514802) | Cod sursa (job #1987927) | Cod sursa (job #1953708) | Cod sursa (job #2390477) | Cod sursa (job #1355800)
#include <cstdio>
#include <vector>
#include <queue>
#include <cmath>
#define inf 200000000
using namespace std;
int n, m, k, dmin[2001], d[17][17], c[17];
struct much{
int b, c;
}a[2003][2003];
class ComparVf
{public:
bool operator () (const int& a, const int& b)
{
return dmin[a]>dmin[b];
}
};
priority_queue<int, vector<int>, ComparVf> h;
void djk(int i)
{
int j, vf;
for(j=1; j<=n; ++j)dmin[j]=inf;
dmin[i]=0;
h.push(i);
while(!h.empty()){
vf=h.top();h.pop();
for(j=1; j<=a[vf][0].b; ++j)
if(dmin[a[vf][j].b]>dmin[vf]+a[vf][j].c){
dmin[a[vf][j].b]=dmin[vf]+a[vf][j].c;
h.push(a[vf][j].b);
}
}
}
int main()
{
freopen("ubuntzei.in", "r", stdin);
freopen("ubuntzei.out", "w", stdout);
scanf("%d%d%d", &n, &m, &k);
int i, j, l, p;
for(i=1; i<=k; ++i)scanf("%d", &c[i]);
for(i=1; i<=m; ++i){
scanf("%d%d%d", &j, &l, &p);
a[j][0].b++;
a[j][a[j][0].b].b=l;
a[j][a[j][0].b].c=p;
a[l][0].b++;
a[l][a[l][0].b].b=j;
a[l][a[l][0].b].c=p;
}
djk(1);
for(i=1; i<=k; ++i)d[0][i]=d[i][0]=dmin[c[i]];
d[0][k+1]=d[k+1][0]=dmin[n];
for(i=1; i<=k; ++i){
djk(c[i]);
for(j=i+1; j<=k; ++j)d[i][j]=d[j][i]=dmin[c[j]];
d[i][k+1]=d[k+1][i]=dmin[n];
}
for(i=0; i<=k+1; ++i)c[i]=0;
c[0]=1;
j=0; n=0;
for(i=1; i<=k; i++){
p=inf;
for(l=1; l<=k; ++l)if(!c[l] && p>d[j][l]){p=d[j][l]; m=l;}
n+=p; c[m]=1; j=m;
}
n+=d[j][k+1];
printf("%d", n);
return 0;
}