Pagini recente » Cod sursa (job #1621367) | Cod sursa (job #1457777) | Cod sursa (job #1298537) | Cod sursa (job #631279) | Cod sursa (job #2573944)
#include <bits/stdc++.h>
#define maxn 2005
#define inf 0x3f3f3f3f
using namespace std;
ifstream fin("ubuntzei.in"); ofstream fout("ubuntzei.out");
int d[maxn][maxn],pr[maxn];
int x[maxn];
int sol,mi=inf;
int n,m,k;
void read()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=j)
d[i][j]=inf;
fin>>n>>m>>k;
for(int i=1;i<=k;i++)
fin>>pr[i];
int x,y,cost;
for(int i=1;i<=m;i++)
{
fin>>x>>y>>cost;
d[x][y]=cost;
d[y][x]=cost;
}
}
void RoyWarshall()
{
int i,j,a;
for(a=1;a<=n;a++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if (d[i][a] && d[a][j] && (d[i][j] > d[i][a] + d[a][j] || d[i][j]==0) && i != j)
d[i][j] = d[i][a] + d[a][j];
}
bool ok(int k)
{
for(int i=1;i<k;i++)
if(x[i]==x[k])
return false;
return true;
}
void back(int p)
{
if(p>k)
{
sol=0;
sol+=d[1][x[1]];
for(int i=1;i<k;i++)
sol+=d[x[i]][x[i+1]];
sol+=d[x[k]][n];
if(sol<mi)
mi=sol;
}
else
{
for(int i=1;i<=k;i++)
{
x[p]=pr[i];
if(ok(p))
back(p+1);
}
}
}
int main()
{
read();
RoyWarshall();
if(k==0)
fout<<d[1][n];
else{
back(1);
fout<<mi;
}
return 0;
}