Pagini recente » Cod sursa (job #2399885) | Cod sursa (job #2768441) | Cod sursa (job #2689649) | Cod sursa (job #1674833) | Cod sursa (job #683493)
Cod sursa(job #683493)
#include <iostream>
#include<fstream>
#include <vector>
#include <algorithm>
#define NMAX 2000
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
int n, m, INFINIT=100001, C[NMAX][NMAX], K, costmin;
vector<int> v;
void citeste()
{ int x, y, z, loc;
in>>n>>m;
in>>K;
for (int i=1; i<=K; ++i)
{
in>>loc;
v.push_back(loc);
}
sort(v.begin(), v.end());
for (int i=1; i<=m; ++i)
{
in>>x>>y>>z;
C[x][y]=C[y][x]=z;
}
}
int dist(int x0, int y0)
{ int i, minim, k, ok, viz[NMAX], d[NMAX];
for (i = 1; i<=n; i++)
{
d[i] = C[x0][i];
viz[i] = 0;
}
viz[x0] = 1; ok = 1;
while (ok)
{
minim = INFINIT;
for (i = 1; i<=n; i++)
if (!viz[i] && minim > d[i])
{
minim = d[i];
k = i;
}
if (minim != INFINIT)
{
viz[k] = 1;
for (i = 1; i<=n; i++)
if (!viz[i] && d[i] > d[k] + C[k][i])
{
d[i] = d[k]+C[k][i];
}
}
else ok = 0;
}
return d[y0];
}
int main()
{ int Cost=0;
citeste();
for (int i=1; i<=n; ++i)
{
for (int j=1; j<=n; ++j)
if (C[i][j] == 0) C[i][j]=INFINIT;
}
if ( K == 0)
out<<dist(1,n);
if (K == 1)
out<<dist(1,v[0]) + dist(v[0],n);
if (K > 1)
{
Cost = dist(1,v[0]);
for (int i=0; i<K-1; ++i)
Cost += dist(v[i], v[i+1]);
Cost += dist(v[K-1], n);
costmin = Cost;
while (next_permutation(v.begin(), v.end()))
{
Cost = dist(1,v[0]);
for (int i=0; i<K-1; ++i)
Cost += dist(v[i], v[i+1]);
Cost += dist(v[K-1], n);
costmin = min(Cost, costmin);
}
out<<costmin;
}
return 0;
}