Pagini recente » Cod sursa (job #11782) | Cod sursa (job #805737) | Cod sursa (job #605917) | Cod sursa (job #354519) | Cod sursa (job #2324685)
#include <fstream>
#include <vector>
#include <algorithm>
#define inf 1000000000
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
bool verif (int cnt, int x, vector<int>&q)
{
for (int i = 1; i <= cnt; i++)
if (q[i] == x)
return false;
return true;
}
void aranjamente (int nr, int lim, int n, int&sol, vector<int>&v, vector<int>&q, vector<vector<int> >&drum)
{
if (nr == lim + 1)
{
int rez = drum[1][v[q[1]]];
for (int i = 1; i < lim; i++)
rez = rez + drum[v[q[i]]][v[q[i + 1]]];
rez = rez + drum[v[q[lim]]][n];
sol = min(sol, rez);
return;
}
for (int i = 1; i <= lim; i++)
{
q[nr] = i;
if (verif(nr - 1, i, q))
aranjamente(nr + 1, lim, n, sol, v, q, drum);
}
}
int main()
{
int n, m, k, nr = 1, sol = inf;
in.sync_with_stdio(false);
in >> n >> m >> k;
vector<int> v(k + 1);
vector<int> q(k + 1);
vector<vector<int> > drum(n + 1, vector<int>(n + 1));
for (int i = 1; i <= k; i++)
in >> v[i];
for (int i = 1; i <= n; i++)
for (int j = i + 1; j <= n; j++)
drum[i][j] = drum[j][i] = inf;
for (int i = 1; i <= m; i++)
{
int x, y, c;
in >> x >> y >> c;
drum[x][y] = c;
drum[y][x] = c;
}
for (int w = 1; w <= n; w++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
{
if (i == j || drum[i][w] == 0 || drum[j][w] == 0)
continue;
drum[i][j] = min(drum[i][j], drum[i][w] + drum[w][j]);
}
aranjamente(nr, k, n, sol, v, q, drum);
out << sol;
return 0;
}