Pagini recente » Cod sursa (job #3170522) | Cod sursa (job #540658) | Cod sursa (job #3237067) | Cod sursa (job #2891080) | Cod sursa (job #621952)
Cod sursa(job #621952)
#include<cstdio>
#include<vector>
#define infile "ubuntzei.in"
#define outfile "ubuntzei.out"
#define n_max 2005
#define INF 999999999
using namespace std;
int c[n_max][n_max];
int nr[n_max], uz[n_max];
int n, K;
void citeste()
{
freopen(infile,"r",stdin);
int m, x, y, cost;
scanf("%d %d",&n,&m);
scanf("%d",&K);
for(int i=1;i<=K;i++)
scanf("%d",&nr[i]);
while(m--)
{
scanf("%d %d %d",&x,&y,&cost);
c[x][y] = c[y][x] = cost;
}
fclose(stdin);
}
int back(int k, int ant)//aacum selectez al k-lea element, cu tatal ant
{
if(k > K)
return c[ant][n];
int minim = INF, rez;
for(int i=1;i<=K;i++)
if( c[ant][nr[i]] && !uz[nr[i]] )
{
uz[nr[i]] = 1;
rez = back(k+1, nr[i]);
uz[nr[i]] = 0;
if(rez + c[ant][nr[i]] < minim)
minim = rez + c[ant][nr[i]];
}
return minim;
}
void rezolva()
{
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(c[i][k] && c[k][j] && ( c[i][k] + c[k][j] < c[i][j] || !c[i][j]) && i!=j)
c[i][j] = c[i][k] + c[k][j];
}
void afiseaza()
{
freopen(outfile,"w",stdout);
printf("%d\n", back(1,1));
fclose(stdout);
}
int main()
{
citeste();
rezolva();
afiseaza();
return 0;
}