Cod sursa(job #1594366)

Utilizator yololy97Olaru Bogdan-Ioan yololy97 Data 9 februarie 2016 14:24:08
Problema Ubuntzei Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#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;
}