Pagini recente » Cod sursa (job #3247830) | Cod sursa (job #2929688) | Cod sursa (job #1758452) | Cod sursa (job #2970343) | Cod sursa (job #1008349)
//Solutie 50 puncte
#include <fstream>
#include <vector>
#include <queue>
#include <string.h>
#include <algorithm>
#define IN "ubuntzei.in"
#define OUT "ubuntzei.out"
#define MAX_SIZE 2009
#define oo 1000000
std :: ifstream f(IN);
std :: ofstream g(OUT);
int N, M, K;
int FRIEND[MAX_SIZE];
int D[MAX_SIZE][MAX_SIZE];
inline void READ_DATA()
{
int x , y , z;
f >> N >> M >> K;
for(int i = 1; i <= K; ++i) f >> FRIEND[i];
for(int i = 1; i <= M; ++i)
{
f >> x >> y >> z;
D[x][y] = D[y][x] = z;
}
}
inline void RF()
{
for(int k = 1; k <= N; ++k)
for(int i = 1; i <= N; ++i)
for(int j = 1; j <= N; ++j)
if(D[i][k] && D[k][j] && (i != j) && (D[i][j] > D[i][k] + D[k][j] || !D[i][j]))
D[i][j] = D[i][k] + D[k][j];
}
void SOLVE()
{
RF();
int BestSol = oo;
if(K > 0)
{
std :: sort(FRIEND + 1, FRIEND + K + 1);
do
{
int Cost = D[1][FRIEND[1]] + D[FRIEND[K]][N];
for(int i = 1; i < K; ++i) Cost += D[FRIEND[i]][FRIEND[i + 1]];
BestSol = std :: min(BestSol, Cost);
}
while(std :: next_permutation(FRIEND + 1, FRIEND + K + 1));
g << BestSol << '\n';
}
else g << D[1][N] << '\n';
}
int main()
{
READ_DATA();
SOLVE();
g.close();
return 0;
}