Cod sursa(job #1226825)

Utilizator Sanduleac_VladSanduleac Vllad Alexandru Sanduleac_Vlad Data 8 septembrie 2014 14:51:00
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#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;
}