Pagini recente » Cod sursa (job #1782536) | Cod sursa (job #184931) | Cod sursa (job #1999121) | Cod sursa (job #2483643) | Cod sursa (job #1594366)
#include <cstdio>
#include <cstring>
#include <queue>
#include<vector>
#define N 2001
using namespace std;
int n, m, K, D[N], S[N];
struct cell{
int nod, d, s;
};
short k[N];
queue<cell> Q;
vector< pair<int, int> > v[N];
int main(){
freopen("ubuntzei.in", "r", stdin);
freopen("ubuntzei.out", "w", stdout);
scanf("%d %d\n", &n, &m);
scanf("%d ", &K);
for(int i = 1; i <= K; ++i){
int x;
scanf("%d ", &x);
k[x] = 1;
}
for(int i = 1; i <= m; ++i){
int x, y, c;
scanf("%d %d %d\n", &x, &y, &c);
v[x].push_back(make_pair(y, c));
v[y].push_back(make_pair(x, c));
}
memset(D, 0x3f3f3f3f, sizeof(D));
D[1] = 0;
for(int i = 1; i <= n; ++i)
S[i] = K + 1;
cell x;
x.nod = 1;
x.d = 0;
x.s = K;
Q.push(x);
while(!Q.empty()){
cell p = Q.front();
Q.pop();
for(vector< pair<int, int> >::iterator it = v[p.nod].begin(); it != v[p.nod].end(); ++it){
if(it->first == n){
if(p.s == 0){
D[n] = min(D[n], p.d + it->second);
}
continue;
}
if(p.s < S[it->first] || (p.s == S[it->first] && p.d < D[it->first])){
S[it->first] = p.s - k[it->first];
D[it->first] = p.d + it->second;
cell x;
x.nod = it->first;
x.d = D[it->first];
x.s = S[it->first];
Q.push(x);
}
}
}
printf("%d\n", D[n]);
return 0;
}