Pagini recente » Cod sursa (job #547140) | Cod sursa (job #2337076) | Cod sursa (job #2218881) | Cod sursa (job #2521145) | Cod sursa (job #1226825)
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
struct L {
long poz;
long dtot;
long dtras;
long nrv;
vector<bool> viz;
};
struct dr {
short ot;
short d;
};
long N, M, K;
long f[2001];
vector<dr> dist[2001];
queue<L> q;
long s, ff, d;
long df = 1000000000;
int main() {
long i, j;
dr tmpd;
L tmp;
freopen("ubuntzei.in", "r", stdin);
freopen("ubuntzei.out", "w", stdout);
scanf("%ld %ld", &N, &M);
scanf("%ld", &K);
for(i = K; i; i--) {
scanf("%ld", &j);
f[j]++;
}
for(i = M; i; i--) {
scanf("%ld %ld %ld", &s, &ff, &d);
tmpd.ot = ff;
tmpd.d = d;
dist[s].push_back(tmpd);
tmpd.ot = s;
dist[ff].push_back(tmpd);
}
tmp.poz = 1;
tmp.dtot = 0;
tmp.dtras = 0;
tmp.nrv = f[1];
tmp.viz.resize(N);
q.push(tmp);
while(!q.empty()) {
if(q.front().poz == N && q.front().nrv == K && df > q.front().dtot)
df = q.front().dtot;
for(i = 0; i < dist[q.front().poz].size(); i++) {
tmp = q.front();
tmp.dtot += dist[q.front().poz][i].d;
if(!tmp.viz[dist[q.front().poz][i].ot] && f[dist[q.front().poz][i].ot]) {
tmp.nrv += f[dist[q.front().poz][i].ot];
tmp.viz[dist[q.front().poz][i].ot] = 1;
}
tmp.poz = dist[q.front().poz][i].ot;
tmp.dtras++;
if(tmp.dtras > 2 * N + 1)
continue;
q.push(tmp);
}
q.pop();
}
printf("%ld\n", df);
return 0;
}