Pagini recente » Cod sursa (job #633880) | Cod sursa (job #770802) | Cod sursa (job #1880644) | Istoria paginii runda/simulareoji2003 | Cod sursa (job #2703875)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream f ("ubuntzei.in");
ofstream g ("ubuntzei.out");
int n, m, k;
long long rez = 2e9;
bool used[2000];
int c[2001][2001];
bool a[2001][2001];
const int inf = 1000000;
vector < int > v;
int main()
{
f >> n >> m >> k;
for (int i=1; i<=k; i++)
{
int x; f >> x;
v.push_back(x);
}
for (int i=1; i<=m; i++)
{
int x, y, z;
f >> x >> y >> z;
a[x][y] = a[y][x] = 1;
c[x][y] = c[y][x] = z;
}
for (int i=1; i<=n; i++)
{
for (int j=1; j<=n; j++)
{
if (!c[i][j]) c[i][j] = inf;
}
}
for (int l=1; l<=n; l++)
for (int i=1; i<=n; i++)
for (int j=1; j<=n; j++) {
if (c[i][j] > c[i][l] + c[l][j])
c[i][j] = c[i][l] + c[l][j];
}
do
{
long long suma = 0;
for (int i=0; i<k; i++)
{
if (i == 0)
{
suma += c[1][v[i]];
}
if (i == k-1)
{
suma += c[v[i]][n];
}
if (i > 0 && i < k-1)
{
suma += c[v[i-1]][v[i]];
}
}
rez = min(rez, suma);
} while (next_permutation(v.begin(), v.end()));
g << rez;
return 0;
}