Pagini recente » Cod sursa (job #2395625) | Cod sursa (job #2286079) | Cod sursa (job #1282555) | Cod sursa (job #2691740) | Cod sursa (job #2531046)
#include <cstdio>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
const int NMAX = 2000;
const int KMAX = 17;
const int INF = 2.e9;
int d[KMAX + 5][(1 << KMAX) + 5] , c[KMAX + 5][NMAX + 5] , v[KMAX + 5];
struct muchii
{
int nod , cost;
};
muchii temp;
vector <muchii> G[NMAX + 5] , T[KMAX + 5];
int main()
{
freopen("ubuntzei.in" , "r" , stdin);
freopen("ubuntzei.out" , "w" , stdout);
int n , m , k , i , j , x , y , z , lim , cost , l;
scanf("%d%d%d" , &n , &m , &k);
for(i = 1 ; i <= k ; i ++)
scanf("%d" , &v[i]);
sort(v + 1 , v + k + 1);
for(i = 1 ; i <= m ; i ++)
{
scanf("%d%d%d" , &x , &y , &z);
temp.nod = y;
temp.cost = z;
G[x].push_back(temp);
temp.nod = x;
G[y].push_back(temp);
}
v[0] = 1;
v[k + 1] = n;
for(i = 0 ; i <= k + 1; i ++)
for(j = 1 ; j <= n ; j ++)
c[i][j] = INF;
set <pair <int , int> > s;
set <pair <int , int> >::iterator it;
for(i = 0 ; i <= k + 1 ; i ++)
{
c[i][v[i]] = 0;
s.insert(make_pair(0 , v[i]));
while(!s.empty())
{
it = s.begin();
x = (*it).second;
cost = (*it).first;
s.erase(s.begin());
if(cost > c[i][x])
continue;
for(j = 0 ; j < G[x].size() ; j ++)
{
y = G[x][j].nod;
if(c[i][y] > c[i][x] + G[x][j].cost)
{
c[i][y] = c[i][x] + G[x][j].cost;
s.insert(make_pair(c[i][y] , y));
}
}
}
}
for(i = 0 ; i <= k + 1 ; i ++)
for(j = 0 ; j <= k + 1 ; j ++)
if(i != j)
{
temp.nod = j;
temp.cost = c[i][v[j]];
T[i].push_back(temp);
}
k = k + 2;
lim = (1 << k) - 1;
for(i = 0 ; i <= k ; i ++)
for(j = 0 ; j <= lim ; j ++)
d[i][j] = INF;
d[0][1] = 0;
for(i = 0 ; i <= lim ; i ++)
for(j = 0 ; j < k ; j ++)
if((i & (1 << j)) != 0)
for(l = 0 ; l < T[j].size() ; l ++)
if((i & (1 << T[j][l].nod)) == 0)
d[T[j][l].nod][i | (1 << T[j][l].nod)] = min(d[T[j][l].nod][i | (1 << T[j][l].nod)] , d[j][i] + T[j][l].cost);
printf("%d\n" , d[k - 1][lim]);
return 0;
}