Pagini recente » Cod sursa (job #1839888) | Cod sursa (job #1725959) | Cod sursa (job #16980) | Cod sursa (job #2334551) | Cod sursa (job #1222825)
#include<iostream>
#include<cstdio>
#include<cmath>
#define ii 200000
using namespace std;
int N,M,K,C[20],m[2005][2005],d[2005],r[20];
bool viz[2005];
FILE *in=fopen("ubuntzei.in","r"),*out=fopen("ubuntzei.out","w");
void dijkstra(int x);
void ins(int c,int l);
int main()
{
fscanf(in,"%d%d%d",&N,&M,&K);
int i,j,x,y,z;
for(i=1;i<=N;i++)
{
for(j=1;j<=N;j++)
m[i][j]=ii;
m[i][i]=0;
}
for(i=1;i<=K;i++) fscanf(in,"%d",&C[i]);
for(i=1;i<=M;i++)
{
fscanf(in,"%d%d%d",&x,&y,&z);
m[x][y]=m[y][x]=z;
}
for(i=1;i<=K;i++) dijkstra(C[i]);
r[1]=1;
r[2]=N;
for(i=1;i<=K;i++) ins(C[i],i+1);
//for(j=1;j<=K+2;j++) cout<<r[j]<<' '; cout<<'\n';
//cout<<m[1][4];
long long R=0;
for(i=1;i<=K+1;i++) R+=m[r[i]][r[i+1]];
fprintf(out,"%d\n",R);
}
void dijkstra(int x)
{
int i,ok=1,minim,k;
for(i=1;i<=N;++i) viz[i]=0,d[i]=m[x][i];
viz[x]=1;
while(ok)
{
minim=200000;
k=0;
for(i=1;i<=N;++i)
{
if(d[i]<minim && !viz[i]) minim=d[i],k=i;
}
if(k)
{
viz[k]=1;
for(i=1;i<=N;++i)
if(d[i]>d[k]+m[i][k]) d[i]=d[k]+m[i][k];
}
else ok=0;
}
for(i=1;i<=N;++i) m[x][i]=m[i][x]=d[i];
}
void ins(int c,int l)
{
int j,mm=2000000000,k;
for(j=1;j<l;j++)
{
if(m[c][r[j]]+m[c][r[j+1]]<mm) mm=m[c][r[j]]+m[c][r[j+1]], k=j;
}
for(j=l+1;j>k+1;j--)
{
r[j]=r[j-1];
}
r[k+1]=c;
}