Pagini recente » Cod sursa (job #230569) | Cod sursa (job #1893244) | Cod sursa (job #2053360) | Cod sursa (job #1583854) | Cod sursa (job #2700660)
#include <fstream>
#include <math.h>
#include <set>
#include <queue>
using namespace std;
ifstream fin ("ubuntzei.in");
ofstream fout ("ubuntzei.out");
int dist[36001], n, f[36001], minim, m, k, sef[36001], oras[2001], a[2001][2001], permutare[2001], rez[2001];
vector <pair <int, int>> l[50001];
priority_queue<pair<int, int> > dist_min;
void floyd()
{
int i, j, k;
for (k = 1; k<= n; k++)
for (i = 1; i<= n; i++)
for (j = 1; j<= n; j++)
if(a[i][j] > a[i][k] + a[k][j])
a[i][j] = a[i][k] + a[k][j];
}
void calc_dist_totala()
{
int i, suma=0;
for(i = 2; i<= k; i++)
suma += a[permutare[i-1]][permutare[i]];
suma += a[1][permutare[1]];
suma += a[permutare[k]][n];
if(suma < minim)
minim = suma;
}
void bkt(int t) {
int i;
if(t == k+1)
calc_dist_totala();
else {
for(i=1; i<=t; i++)
{
permutare[t] = oras[i];
if(f[permutare[t]]==0)
{
f[permutare[t]]=1;
bkt(t+1);
f[permutare[t]]=0;
}
}
}
}
int main()
{
int C, i, j, x, y;
fin >> n >> m >> k;
for (i = 1; i<= k ;i++)
fin >> oras[i];
for (i = 1; i<= m; i++)
{
fin >> x >> y >> C;
a[x][y] = a[y][x] = C;
}
for (i = 1; i<= n; i++)
for (j = 1; j<= n; j++)
if(i != j && a[i][j] == 0)
a[i][j] = 1e9;
floyd();
if (k == 0)
{
fout << a[1][n];
return 0;
}
minim = 1e9;
bkt(1);
fout << minim;
return 0;
}