Pagini recente » Cod sursa (job #771345) | Cod sursa (job #744577) | Cod sursa (job #611766) | Cod sursa (job #1939047) | Cod sursa (job #1008342)
//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)
D[i][j] = std :: min(D[i][j], D[i][k] + D[k][j]);
}
void SOLVE()
{
RF();
int BestSol = oo;
if(K > 0)
{
std :: sort(FRIEND + 1, FRIEND + N + 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;
}