Pagini recente » Cod sursa (job #1280786) | Cod sursa (job #1045255) | Cod sursa (job #1754153) | Istoria paginii utilizator/politehnica_pascu_corneliu_florin | Cod sursa (job #1649047)
#include <bits/stdc++.h>
#define oo 30000000
using namespace std;
int a[2002][2002], n, solMin;
int t[20], k, st[20], viz[20];
void Citire()
{
int i, j, x, y, c, m;
ifstream fin("ubuntzei.in");
fin >> n >> m;
fin >> k;
for (i = 1; i <= k; ++i)
fin >> t[i];
for (i = 1; i <= n; ++i)
for (j = 1; j <= n; ++j)
a[i][j] = oo;
for (i = 1; i <= n; ++i)
a[i][i] = 0;
for (i = 1; i <= m; ++i)
{
fin >> x >> y >> c;
a[x][y] = a[y][x] = c;
}
fin.close();
}
void FloydWarshall()
{
int i, j, p;
for (p = 1; p <= n; ++p)
for (i = 1; i <= n; ++i)
if (i != p)
for (j = 1; j <= n; ++j)
if (i != j && j != p)
a[i][j] = min(a[i][j],a[i][p]+a[p][j]);
}
void Solutie()
{
int sol, i;
if (k == 0)
{
solMin = a[1][n];
return ;
}
sol = a[1][t[st[1]]];
for (i = 2; i <= k; ++i)
sol += a[t[st[i-1]]][t[st[i]]];
sol += a[t[st[k]]][n];
solMin = min(solMin, sol);
}
void Perm(int top)
{
int i;
if (top == k + 1) Solutie();
else for (i = 1; i <= k; ++i)
if (viz[i] == 0)
{
viz[i] = 1;
st[top] = i;
Perm(top + 1);
viz[i] = 0;
}
}
int main()
{
Citire();
FloydWarshall();
solMin = oo;
Perm(1);
ofstream fout("ubuntzei.out");
fout << solMin << "\n";
fout.close();
return 0;
}