Pagini recente » Cod sursa (job #2568453) | Cod sursa (job #2814699) | Cod sursa (job #2918152) | Cod sursa (job #293799) | Cod sursa (job #586913)
Cod sursa(job #586913)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
const char iname[] = "ubuntzei.in";
const char oname[] = "ubuntzei.out";
const int nmax = 2005;
const int infinity = 199999999;
ifstream fin(iname);
ofstream fout(oname);
int n, m, k, i, oras[nmax], x, y, c, j, cineva, viz[nmax];
vector<pair<int, int> > Gr[nmax];
int minimul= 29029292, kate;
int RF[nmax][nmax], sol[nmax];
void afis()
{
int i;
int sum = 0;
sum = sum + RF[1][sol[1]];
for(i = 1; i <= kate - 1; i ++)
sum = sum + RF[sol[i]][sol[i + 1]];
sum = sum + RF[sol[kate]][n];
if(sum < minimul)
minimul = sum;
}
void back(int pas)
{
if(pas == kate + 1)
afis();
else
{
for(cineva = 1; cineva <= kate; cineva++)
if(!viz[oras[cineva]])
{
viz[oras[cineva]] = 1;
sol[pas] = oras[cineva];
back(pas + 1);
}
}
}
int main()
{
fin >> n >> m;
fin >> kate;
for(i = 1; i <= kate; i ++)
fin >> oras[i];
for(i = 1; i <= n; i ++)
for(j = 1; j <= n; j ++)
if(i != j)
RF[i][j] = infinity;
for(i = 1; i <= m; i ++)
{
fin >> x >> y >> c;
Gr[x].push_back(make_pair(y, c));
RF[x][y] = RF[y][x] = c;
}
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
for(k = 1; k <= n; k ++)
if(i != j && i != k && j != k)
RF[i][j] = min(RF[i][j], RF[i][k] + RF[k][j]);
back(1);
fout << minimul << "\n";
return 0;
}