Pagini recente » Cod sursa (job #212879) | Cod sursa (job #1614540) | Cod sursa (job #1971736) | Cod sursa (job #1749946) | Cod sursa (job #693864)
Cod sursa(job #693864)
#include <cstdio>
#include <queue>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
#define maxN 2005
#define INF 0x3f3f3f3f
int N , M , K , C[20];
int cost[maxN][maxN] , minim;
int x[20];
void roy_floyd ()
{
for (int k = 1 ; k <= N ; ++k)
for (int i = 1 ; i <= N ; ++i)
for (int j = 1 ; j <= N ; ++j)
{
if (i == j) continue;
if ((cost[i][k] && cost[k][j] && cost[i][k] + cost[k][j] < cost[i][j]) || !cost[i][j])
cost[i][j] = cost[i][k] + cost[k][j];
}
}
void solve ()
{
int costcur = cost[1][x[1]];
for (int i = 1 ; i < K ; ++i)
costcur += cost[x[i]][x[i + 1]];
costcur += cost[x[K]][N];
if (costcur < minim)
minim = costcur;
}
bool valid (int k)
{
for (int i = 1 ; i < k ; ++i)
for (int j = i + 1 ; j <= k ; ++j)
if (x[i] == x[j])
return 0;
return 1;
}
void back (int k)
{
for (int i = 1 ; i <= K ; ++i)
{
x[k] = C[i];
if (valid (k))
if (k == K)
solve ();
else back (k + 1);
}
}
int main ()
{
freopen ("ubuntzei.in" , "r" , stdin);
freopen ("ubuntzei.out" , "w" , stdout);
scanf ("%d %d" , &N , &M);
scanf ("%d" , &K);
for (int i = 1 ; i <= K ; ++i)
scanf ("%d" , &C[i]);
/*for (int i = 1 ; i <= N ; ++i)
for (int j = 1 ; j <= N ; ++j)
cost[i][j] = INF;*/
int a , b , c;
for (int i = 1 ; i <= M ; ++i)
{
scanf ("%d %d %d" , &a , &b , &c);
cost[a][b] = c;
cost[b][a] = c;
}
minim = INF;
roy_floyd ();
back (1);
printf ("%d" , minim);
return 0;
}