Pagini recente » Cod sursa (job #952796) | Cod sursa (job #659369) | Cod sursa (job #714702) | Cod sursa (job #1929999) | Cod sursa (job #2553212)
#include <fstream>
#include <iostream>
#include <queue>
#include <vector>
#include <tuple>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n, m, k;
vector<pair <int, int> > g[2005];
int prieteni[2005];
bool visited[4100][2005];
void citire() {
fin >> n >> m >> k;
int nod;
for(int i = 1; i <= k; i++) {
fin >> nod;
prieteni[nod] = i;
}
int x, y, z;
while(m--) {
fin >> x >> y >> z;
g[x].push_back({y, z});
g[y].push_back({x, z});
}
}
void solve() {
priority_queue<tuple<int, int, int> >q;
q.push(make_tuple(0, 0, 1));
while(!q.empty()) {
int dist = -get<0>(q.top());
int mask = -get<1>(q.top());
int lastNode = get<2>(q.top());
q.pop();
//cout << dist << ' ' << mask << ' ' << lastNode << '\n';
if(lastNode == n && mask == ( (1 << k )- 1) ) {
fout << dist;
return;
}
if(visited[mask][lastNode]) continue;
visited[mask][lastNode] = true;
for(int i = 0; i < g[lastNode].size(); i++) {
int newMask = mask;
if(prieteni[g[lastNode][i].first])
newMask |= (1 << (prieteni[g[lastNode][i].first]-1));
q.push(make_tuple(-dist-g[lastNode][i].second, -newMask, g[lastNode][i].first));
}
}
}
int main() {
citire();
solve();
}