Pagini recente » Cod sursa (job #819959) | Cod sursa (job #112494) | Cod sursa (job #2568480) | Cod sursa (job #2731028) | Cod sursa (job #2324694)
#include <fstream>
#include <vector>
#include <algorithm>
#define inf 2000000000
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
bool verif (int cnt, vector<int>&q)
{
for (int i = 1; i <= cnt; i++)
if (q[i] == q[cnt + 1])
return false;
return true;
}
void aranjamente (int nr, int k, int n, int&sol, vector<int>&v, vector<int>&q, vector<vector<int> >&drum)
{
if (nr == k + 1)
{
int rez = drum[1][v[q[1]]];
for (int i = 1; i < k; i++)
rez = rez + drum[v[q[i]]][v[q[i + 1]]];
rez = rez + drum[v[q[k]]][n];
sol = min(sol, rez);
return;
}
for (int i = 1; i <= k; i++)
{
q[nr] = i;
if (verif(nr - 1, q))
aranjamente(nr + 1, k, 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 <= 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 = i + 1; j <= n; j++)
if (i != j && drum[i][w] && drum[j][w])
if (drum[i][j] > drum[i][w] + drum[w][j] || drum[i][j] == 0)
drum[i][j] = drum[j][i] = drum[i][w] + drum[w][j];
if (k == 0)
{
out << drum[1][n];
return 0;
}
aranjamente(nr, k, n, sol, v, q, drum);
out << sol;
return 0;
}