Pagini recente » Cod sursa (job #42467) | Cod sursa (job #1238504) | Cod sursa (job #2663054) | Cod sursa (job #3239686) | Cod sursa (job #1889072)
#define pi 2100000001
#include <fstream>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int A[2001][2001],T[2001],cate=0;
int n,k,m;
int p[2001],lung,paux[2001],O[2001];
void dij(int D[2001],int ord)
{
cate++;
O[p[ord]]=1;
int S[2001]={0},T1[2001]={0};
int i,j,minn,poz;
S[p[ord]]=1;
for(i=1;i<=n-1;i++)
{
minn=pi;
for(j=1;j<=n;j++)
{
if(S[j]==0)
{
if(D[j]<minn)
{
minn=D[j];
poz=j;
}
}
}
S[poz]=1;
for(j=1;j<=n;j++)
{
if(S[j]==0)
{
if(D[j]>D[poz]+A[poz][j])
D[j]=D[poz]+A[poz][j];
}
}
}
minn=pi;
int miin;
for(i=1;i<=n;i++)
A[p[ord]][i]=D[i];
if(cate!=k+1)
{
for(i=1;i<=k;i++)
{
if(O[p[i]]==0)
{
if(D[p[i]]<minn)
{
minn=D[p[i]];
miin=p[i];
}
}
}
lung+=minn;
dij(A[miin],paux[miin]);
}
else
{
lung+=D[n];
fout<<lung;
}
}
int main()
{
fin>>n>>m;
fin>>k;
p[0]=1;
p[k+1]=n;
int i,j,x,y,z;
for(i=1;i<=k;i++)
{
fin>>p[i];
paux[p[i]]=i;
}
for(i=1;i<=m;i++)
{
fin>>x>>y>>z;
A[x][y]=A[y][x]=z;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(A[i][j]==0)
A[i][j]=pi;
}
}
dij(A[1],0);
return 0;
}