Pagini recente » Cod sursa (job #759333) | Cod sursa (job #668172) | Cod sursa (job #1146510) | Cod sursa (job #399561) | Cod sursa (job #686230)
Cod sursa(job #686230)
#include <stdio.h>
#include <vector>
#include <algorithm>
#define nmax 2005
using namespace std;
vector<int> v;
int n, m, k;
long long a[nmax][nmax];
void citeste()
{ int x, y, c;
scanf("%d %d", &n, &m);
scanf("%d", &k);
for (int i=1; i<=k; ++i)
{
scanf("%d", &x);
v.push_back(x);
}
for (int i=1; i<=m; ++i)
{
scanf("%d %d %d", &x, &y, &c);
a[x][y] = a[y][x] = c;
}
}
void costuri()
{ int maxim = 100005;
for (int i=1; i<=n; ++i)
for (int j=1; j<=n; ++j)
if (a[i][j] == 0 && i != j)
a[i][j]=maxim;
for (int k=1; k<=n; ++k)
for (int i=1; i<=n; ++i)
for (int j=1; j<=n; ++j)
if ( a[i][j] > a[i][k] + a[k][j] )
a[i][j] = a[i][k] + a[k][j];
}
int main()
{ int cost, costmin;
freopen("ubuntzei.in", "r", stdin);
freopen("ubuntzei.out", "w", stdout);
citeste();
costuri();
if (k == 0)
{
printf("%d", a[1][n]);
}
if (k == 1)
{
cost = a[1][v[0]] + a[v[0]][n];
printf("%d", cost);
}
if (k > 1)
{
cost = a[1][v[0]];
for (int i=0; i<k-1; ++i)
cost += a[v[i]][v[i+1]];
cost += a[v[k-1]][n];
costmin = cost;
while ( next_permutation(v.begin(), v.end()) )
{
cost = a[1][v[0]];
for (int i=0; i<k-1; ++i)
cost += a[v[i]][v[i+1]];
cost += a[v[k-1]][n];
costmin = min(costmin, cost);
}
printf("%d", costmin);
}
}