Pagini recente » Cod sursa (job #2468226) | Cod sursa (job #2713136) | Cod sursa (job #2988210) | Cod sursa (job #2963767) | Cod sursa (job #1118638)
#include <fstream>
#include <vector>
#include <algorithm>
#define nmax 2000+5
#define inf 1 << 25
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n, m, k;
vector<int> prieteni;
vector<int> graf[nmax];
int dist[nmax][nmax];
int minim;
void citire()
{
int x, y, c;
fin >> n >> m;
fin >> k;
for (int i = 1; i <= k; i++)
{
fin >> x;
prieteni.push_back(x);
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
dist[i][j] = inf;
for (int i = 1; i <= m; i++)
{
fin >> x >> y >> c;
dist[x][y] = c;
dist[y][x] = c;
}
}
void rezolvare()
{
int t;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
for (int k = 1; k <= n; k++)
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
minim = inf;
if (prieteni.size() > 0)
{
do
{
t = dist[1][prieteni[0]];
for (int i = 1; i < k; i++)
t += dist[prieteni[i-1]][prieteni[i]];
t += dist[prieteni[k-1]][n];
minim = min(minim, t);
} while (next_permutation(prieteni.begin(), prieteni.end()));
}
else
minim = dist[1][n];
}
void afisare()
{
fout << minim;
}
int main()
{
citire();
rezolvare();
afisare();
return 0;
}