Pagini recente » Cod sursa (job #2999896) | Cod sursa (job #2826427) | Cod sursa (job #1709622) | Cod sursa (job #2465977) | Cod sursa (job #2336838)
#include <fstream>
#include <iostream>
#include <algorithm>
#define input "ubuntzei.in"
#define output "ubuntzei.out"
#define NMAX 2005
using namespace std;
ifstream in(input);
ofstream out(output);
long long dist[NMAX][NMAX];
int N, M, K, nec[20], stiva[20];
bool uz[100005];
long long min_dist = 1000000000;
void Read_Data()
{
in >> N >> M >> K;
for (int i = 1; i <= K; i++)
in >> nec[i];
sort(nec + 1, nec + K + 1);
for (int i = 1; i <= M; i++)
{
int x, y, c;
in >> x >> y >> c;
dist[x][y] = dist[y][x] = c;
}
}
void Floyd_Warshall()
{
for (int k = 1; k <= N; k++)
for (int i = 1; i <= N; i++)
for (int j = 1; j <= N; j++)
if (!dist[i][j])
{
if (dist[i][k] && dist[k][j])
dist[i][j] = dist[i][k] + dist[k][j];
}
else
{
if (dist[i][k] && dist[k][j] && dist[i][k] + dist[k][j] < dist[i][j])
dist[i][j] = dist[i][k] + dist[k][j];
}
}
void Check_Sol()
{
long long local_dist = 0;
local_dist += dist[1][stiva[1]];
if (K > 1)
for (int i = 1; i < K; i++)
local_dist += dist[stiva[i]][stiva[i + 1]];
local_dist += dist[stiva[K]][N];
if (local_dist < min_dist)
min_dist = local_dist;
}
void BKT(int nivel)
{
if (nivel > K) Check_Sol();
else for (int i = 1; i <= K; i++)
{
int p = nec[i];
if (nivel == 1 && !uz[p])
{
uz[p] = 1;
stiva[nivel] = p;
BKT(nivel + 1);
uz[p] = 0;
}
else if (!uz[p] && dist[stiva[nivel-1]][p])
{
uz[p] = 1;
stiva[nivel] = p;
BKT(nivel + 1);
uz[p] = 0;
}
}
}
void Solve()
{
if (!K) min_dist = dist[1][N];
else BKT(1);
out << min_dist << "\n";
}
int main()
{
Read_Data();
Floyd_Warshall();
Solve();
return 0;
}