Pagini recente » Cod sursa (job #155652) | Cod sursa (job #2261890) | Cod sursa (job #2357697) | Cod sursa (job #1211392) | Cod sursa (job #1837773)
#include <cstdio>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
const long long inf = (LONG_LONG_MAX / 2) - 1;
int n, m;
long long vecini[2005][2005];
int muchiiObligatorii[20];
int k;
int permutari[20];
int viz[2005];
long long distMin = inf;
void citire()
{
scanf("%d %d", &n, &m);
scanf("%d", &k);
for(int i = 0; i < k; i++)
{
scanf("%d", &muchiiObligatorii[i]);
muchiiObligatorii[i]--;
if(muchiiObligatorii[i] == 0 || muchiiObligatorii[i] == n - 1)
{
i--;
k--;
}
}
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
vecini[i][j] = inf;
}
}
int tmp1, tmp2, tmp3;
for(int i = 0; i < m; i++)
{
scanf("%d %d %d", &tmp1, &tmp2, &tmp3);
tmp1--;
tmp2--;
vecini[tmp1][tmp2] = (long long)tmp3;
vecini[tmp2][tmp1] = (long long)tmp3;
}
}
void royFloyd()
{
for(int x = 0; x < n; x++)
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
if(x != i && x != j && i != j)
{
if(vecini[i][j] > vecini[i][x] + vecini[x][j])
{
vecini[i][j] = vecini[i][x] + vecini[x][j];
}
}
}
}
}
}
void solve()
{
long long dist = 0;
dist += vecini[0][permutari[0]];
for(int i = 0; i < k - 1; i++)
{
dist += vecini[permutari[i]][permutari[i + 1]];
if(dist > inf)
{
return;
}
}
dist += vecini[permutari[k - 1]][n - 1];
if(dist < distMin)
{
distMin = dist;
}
}
void generarePermutari(int x)
{
if(x == k)
{
solve();
}
else
{
for(int i = 0; i < k; i++)
{
if(viz[muchiiObligatorii[i]] == false)
{
viz[muchiiObligatorii[i]] = true;
permutari[x] = muchiiObligatorii[i];
generarePermutari(x + 1);
viz[muchiiObligatorii[i]] = false;
}
}
}
}
int main()
{
freopen("ubuntzei.in", "r", stdin);
freopen("ubuntzei.out", "w", stdout);
citire();
royFloyd();
if(k == 0)
{
printf("%d", vecini[0][n - 1]);
}
else
{
generarePermutari(0);
printf("%lld", distMin);
}
return 0;
}