Pagini recente » Cod sursa (job #1642535) | Cod sursa (job #1313013) | Cod sursa (job #1824400) | Cod sursa (job #3215362) | Cod sursa (job #1603456)
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
#define Node pair<long long,long long>
#define mk make_pair
#define d first
#define c second
#define MAX 2010
#define INFINITY (1<<30)
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
struct Comparator
{
bool operator () (Node const &e1, Node const &e2)
{
return e1.c > e2.c;
}
};
vector<Node> L[MAX];
priority_queue<Node, vector<Node>, Comparator> H;
long long D[MAX],O[MAX],N,M,K;
long long Dijkstra(long long S, long long it)
{
H.push(mk(S, D[S]));
while (H.size())
{
Node el = H.top();
H.pop();
if (O[el.d] == 1 && it != K + 1)
{
O[el.d] = 2;
while (H.size())
H.pop();
return el.d;
}
else if (it == K + 1 && el.d == N)
return 0;
for (long long i = 0;i < L[el.d].size();++i)
{
if (el.c + L[el.d][i].c < D[L[el.d][i].d])
{
D[L[el.d][i].d] = el.c + L[el.d][i].c;
H.push(mk(L[el.d][i].d, D[L[el.d][i].d]));
}
}
}
}
int main()
{
in >> N >> M >> K;
for (long long i = 1;i <= K;++i)
{
long long x;
in >> x;
O[x] = 1;
}
for (long long i = 1;i <= M;++i)
{
long long x, y, cost;
in >> x >> y >> cost;
L[x].push_back(mk(y, cost));
L[y].push_back(mk(x, cost));
}
long long el = 1;
for (long long i = 1;i <= K+1;++i)
{
for (long long j = 1;j <= N;++j)
if(j!=el)
D[j] = INFINITY;
el = Dijkstra(el, i);
}
out << D[N];
return 0;
}