Pagini recente » Cod sursa (job #76208) | Cod sursa (job #2179264) | Cod sursa (job #929492) | Cod sursa (job #2255086) | Cod sursa (job #2935492)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
const int NMAX = 2000;
const int KMAX = 15;
const int MASK = (1 << KMAX) - 1;
const int INF = 1e9;
int N, M, K;
int C[KMAX + 1];
int idx[NMAX];
vector<pair<int, int>> adj[NMAX];
int dist[NMAX][MASK];
bool inQ[NMAX][MASK];
struct compare {
bool operator () (const pair<int, int> &a, const pair<int, int> &b) const {
return dist[a.first][a.second] > dist[b.first][b.second];
}
};
void dij(int source = 0) {
fill(dist[0], dist[NMAX], INF);
priority_queue<pair<int, int>, vector<pair<int, int>>, compare> pq;
dist[source][0] = 0;
pq.push({source, 0});
inQ[source][0] = 1;
while(!pq.empty()) {
int u = pq.top().first, mask = pq.top().second;
pq.pop();
inQ[u][mask] = 0;
// cout << u << " " << mask << " " << dist[u][mask] << " => ";
for(const auto &it: adj[u]) {
if(idx[it.first] != -1) {
if(dist[it.first][mask | (1 << idx[it.first])] > dist[u][mask] + it.second) {
dist[it.first][mask | (1 << idx[it.first])] = dist[u][mask] + it.second;
if(!inQ[it.first][mask | (1 << idx[it.first])]) {
// cout << it.first << " " << (mask | (1 << idx[it.first])) << " " << dist[it.first][mask | (1 << idx[it.first])] << "; ";
pq.push({it.first, mask | (1 << idx[it.first])});
inQ[it.first][mask | (1 << idx[it.first])] = 1;
}
}
} else {
if(dist[it.first][mask] > dist[u][mask] + it.second) {
dist[it.first][mask] = dist[u][mask] + it.second;
if(!inQ[it.first][mask]) {
// cout << it.first << " " << mask << " " << dist[it.first][mask] << "; ";
pq.push({it.first, mask});
inQ[it.first][mask] = 1;
}
}
}
}
// cout << '\n';
}
}
int main() {
ios_base :: sync_with_stdio(false);
fin >> N >> M;
fill(idx, idx + N, -1);
fin >> K;
for(int i = 0; i < K; i++) {
fin >> C[i];
C[i]--;
idx[C[i]] = i;
}
for(int i = 1; i <= M; i++) {
int u, v, c;
fin >> u >> v >> c;
u--; v--;
adj[u].push_back({v, c});
adj[v].push_back({u, c});
}
dij();
fout << dist[N - 1][(1 << K) - 1] << '\n';
return 0;
}