Pagini recente » Cod sursa (job #1236309) | Cod sursa (job #316284) | Cod sursa (job #453711) | Cod sursa (job #1958775) | Cod sursa (job #2726276)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f ("ubuntzei.in");
ofstream g ("ubuntzei.out");
int n, m, k, rez;
const int inf = 1e9;
int v[2005];
bool used[2005];
int dp[2005][2005], sol[2005];
void Eval ()
{
int sum = 0;
for (int i=1; i<k; i++)
{
int nod = v[sol[i]];
int vecin = v[sol[i+1]];
sum += dp[nod][vecin];
}
sum += dp[1][v[sol[1]]];
sum += dp[v[sol[k]]][n];
rez = min(rez, sum);
}
void Bkt (int niv)
{
for (int i=1; i<=k; i++)
{
if (!used[i])
{
sol[niv] = i;
used[i] = 1;
if (niv == k) Eval();
else Bkt(niv + 1);
used[i] = 0;
}
}
}
int main()
{
f >> n >> m >> k;
for (int i=1; i<=k; i++)
f >> v[i];
for (int i=1; i<=m; i++)
{
int x, y, c;
f >> x >> y >> c;
dp[x][y] = dp[y][x] = c;
}
for (int i=1; i<=n; i++)
{
for (int j=1; j<=n; j++)
{
if (i != j && !dp[i][j])
dp[i][j] = inf;
}
}
for (int t=1; t<=n; t++)
{
for (int i=1; i<=n; i++)
{
for (int j=1; j<=n; j++)
{
if (i != j && dp[i][t] && dp[t][j])
dp[i][j] = min(dp[i][j], dp[i][t] + dp[t][j]);
}
}
}
if (k == 0)
g << dp[1][n];
else
{
sort(v+1, v+k+1);
rez = inf; Bkt(1);
g << rez;
}
return 0;
}