Pagini recente » Cod sursa (job #476201) | Cod sursa (job #699651) | Cod sursa (job #706171) | Cod sursa (job #413376) | Cod sursa (job #2567213)
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
#define mp make_pair
#define pb push_back
const int NMAX = 10005, Infinity = 1<<30, KMAX = 18;
typedef pair < int, int > PAIR;
int n, m, K, Dist[NMAX][NMAX], Friends[KMAX], MIN = 1<<30, LIM, DP[KMAX][1 << KMAX];
vector < PAIR > Edge[NMAX];
priority_queue < PAIR > Q;
bitset < NMAX > Seen;
void Read()
{
int x, y, c;
in >> n >> m >> K;
Friends[0] = 1;
Friends[K+1] = n;
K++;
for(int i = 1; i < K; i++)
in >> Friends[i];
K++;
for(int i = 1; i <= m; i++)
in >> x >> y >> c, Edge[x].pb(mp(y, c)), Edge[y].pb(mp(x, c));
}
void Dijkstra(int x)
{
int row = x;
for(int i = 1; i <= n; i++)
Seen[i] = 0, Dist[x][i] = Infinity;
Dist[x][x] = 0;
Q.push(mp(0, x));
while(!Q.empty())
{
x = Q.top().second;
Q.pop();
if(!Seen[x])
{
for(PAIR it : Edge[x])
if(it.second + Dist[row][x] < Dist[row][it.first])
Dist[row][it.first] = it.second + Dist[row][x], Q.push(mp(-Dist[row][it.first], it.first));
Seen[x] = 1;
}
}
}
int main()
{
Read();
for(int i = 0; i < K; i++)
Dijkstra(Friends[i]);
LIM = (1<<K) -1;
for(int i = 1; i <= LIM; i++)
for(int j = 0; j < K; j++)
DP[j][i] = Infinity;
for(int i = 0; i < K; i++)
DP[i][1 << i] = Dist[1][Friends[i]];
for(int i = 1; i <= LIM ; i++)
for(int j = 0; j < K ; j++)
if(i & (1 << j))
for (int z = 0; z < K; z++)
if (!((1<<(z))&i))
DP[z][i^(1<<(z))] = min(DP[z][i^(1<<(z))],DP[j][i]+Dist[Friends[j]][Friends[z]]);
out << DP[K-1][LIM];
return 0;
}