Pagini recente » Cod sursa (job #2520173) | Cod sursa (job #1899385) | Cod sursa (job #2672640) | Cod sursa (job #54246) | Cod sursa (job #2523291)
#include <bits/stdc++.h>
#define NMAX 2005
#define inf 1 << 29
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int G[NMAX][NMAX];
int K,M,N;
int Oras_Pr[20];
void citire()
{
f>> N >> M;
f >> K;
for(int i =1 ; i <= K ;i++)
f >> Oras_Pr[i];
for(int i = 1; i <= N;i++)
for(int j = 1 ; j <= N ; j++)
if(i != j ) G[i][j] = inf;
else G[i][j] = 0;
for(int i = 1; i <= M ; i++)
{
int x,y,cost;
f >> x >> y >> cost;
G[x][y]= cost;
G[y][x]= cost;
}
}
void Roy_Floyd()
{
int k,i,j;
for(k = 1 ; k <= N ; k++)
{
for(i = 1 ; i <= N ; i++)
for(j = 1 ; j <= N ;j++)
if(G[i][j] > G[i][k] + G[k][j])
G[i][j] = G[i][k] + G[k][j];
}
}
int dim,permutare[20];
int Traseu(int *permutare,int dim)
{
int cost = 0;
permutare[0] = 1;
permutare[dim + 1 ] = N;
for(int i = 0 ; i <= K ; i++)
cost += G[permutare[i]][permutare[i+1]];
return cost;
}
bool valid(int Numar)
{
for(int i = 1 ; i < dim ; i++)
if(permutare[i] == Numar)
return false;
return true;
}
int cost_final = inf;
void GenerarePerm(int dim)
{
int i,cost;
for(i = 1 ; i <=K ; i++)
{
permutare[dim] = Oras_Pr[i];
if(valid(Oras_Pr[i]))
{
if( dim == K )
{
cost = Traseu ( permutare , dim);
if(cost < cost_final)
cost_final = cost;
}
else
GenerarePerm(dim + 1);
}
}
}
int main()
{
citire();
Roy_Floyd();
GenerarePerm(1);
g<< cost_final;
return 0;
}