Pagini recente » Cod sursa (job #1431303) | Cod sursa (job #1924936) | Cod sursa (job #1642318) | Cod sursa (job #2070526) | Cod sursa (job #840135)
Cod sursa(job #840135)
#include <fstream>
#include <queue>
#include <vector>
#define pii pair<int,int>
#define x first
#define y second
#define mp make_pair
using namespace std;
ifstream cin("ubuntzei.in");
ofstream cout("ubuntzei.out");
const int nmax = 2002, inf = int(2e9);
vector< pii > G[nmax];
int N, M, K, C[16];
priority_queue< pii ,vector< pii > > h;
vector<int> D[16];
int bst[1<<15][16];
void readData() {
cin>>N>>M>>K;
for(int i = 0;i < K;++i) {
cin>>C[i];
C[i]--;
}
int a, b, c;
for(int i = 1;i <= M;++i) {
cin>>a>>b>>c;
a--;b--;
G[a].push_back(mp(b,c));
G[b].push_back(mp(a,c));
}
}
void djikstra(int src,vector<int> &dist) {
dist.resize(N,inf);
dist[src] = 0;
h.push(mp(0,src));
int v;
while(!h.empty()) {
v = h.top().y;
h.pop();
for(vector< pii >::const_iterator w = G[v].begin();w != G[v].end();++w) {
if(dist[(*w).x] > dist[v] + (*w).y) {
dist[(*w).x] = dist[v] + (*w).y;
h.push(mp(-dist[(*w).x],(*w).x));
}
}
}
}
int solve() {
int ret = inf;
if(!K) {
djikstra(0,D[0]);
return D[0][N - 1];
}
queue< pii > q;
for(int i = 0;i < (1<<K);++i) {
for(int j = 0;j < K;++j) {
bst[i][j] = inf;
}
}
for(int i = 0;i < K;++i) {
djikstra(C[i],D[i]);
q.push(mp(1<<i,i));
bst[1<<i][i] = D[i][0];
}
pii state;
while(!q.empty()) {
state = q.front();
q.pop();
for(int j = 0;j < K;++j) {
if((state.x >>j) & 1) continue;
if(bst[state.x | (1<<j)][j] > bst[state.x][state.y] + D[state.y][C[j]]) {
bst[state.x | (1<<j)][j] = bst[state.x][state.y] + D[state.y][C[j]];
q.push(mp(state.x | (1<<j),j));
}
}
}
for(int j = 0;j < K;++j) {
ret = min(ret,bst[(1<<K) - 1][j] + D[j][N - 1]);
}
return ret;
}
int main()
{
readData();
cout<<solve();
return 0;
}