Pagini recente » Cod sursa (job #14333) | Cod sursa (job #35309) | Cod sursa (job #2657493) | Cod sursa (job #1312311) | Cod sursa (job #1890407)
#include <iostream>
#include <fstream>
#include <bitset>
#include <vector>
#include <queue>
#define NMAX 2005
#define MMAX 10005
#define inf 0x3f3f3f3f
using namespace std;
ifstream fin ("ubuntzei.in");
ofstream fout ("ubuntzei.out");
int n, m, k, dist[NMAX][MMAX];
bitset <NMAX> ubuntzel;
bitset <MMAX> checked[NMAX];
vector <pair <int, int> > muchii[NMAX];
struct Drum {
int nod, dist, ubu;
Drum (int x, int y, int z) {
nod = x;
dist = y;
ubu = z;
}
bool operator<(const Drum& altu) const {
return dist < altu.dist;
}
};
priority_queue <Drum> pq;
int dijkstra () {
for (int i = 1; i <= n; ++i) {
for (int j = 0; j <= k; ++j) {
dist[i][j] = inf;
}
}
dist[1][0] = 0;
pq.push(Drum(1,0,0));
while (pq.size()) {
Drum d = pq.top();
pq.pop();
if (checked[d.nod][d.ubu]) {
continue;
}
checked[d.nod][d.ubu] = 1;
for (int i = 0; i < muchii[d.nod].size(); ++i) {
Drum nou = Drum(muchii[d.nod][i].first,dist[d.nod][d.ubu] + muchii[d.nod][i].second,d.ubu);
nou.ubu += ubuntzel[nou.nod];
if (nou.ubu <= k && nou.dist < dist[nou.nod][nou.ubu]) {
dist[nou.nod][nou.ubu] = nou.dist;
nou.dist = -nou.dist;
pq.push(nou);
}
}
}
return dist[n][k];
}
int main ()
{
fin >> n >> m;
fin >> k;
int x, y, z;
for (int i = 1; i <= k; ++i) {
fin >> x;
ubuntzel[x] = 1;
}
for (int i = 1; i <= m; ++i) {
fin >> x >> y >> z;
muchii[x].push_back(make_pair(y,z));
muchii[y].push_back(make_pair(x,z));
}
fout << dijkstra();
fin.close();
fout.close();
return 0;
}