Cod sursa(job #1426913)

Utilizator AplayLazar Laurentiu Aplay Data 30 aprilie 2015 22:37:00
Problema Distante Scor 0
Compilator cpp Status done
Runda utcn_grafuri_training Marime 1.77 kb
#include <stdio.h>
#include <vector>
#include <set>

#define NMAX 50001
#define INF 0x7FFFFFFF

using namespace std;

int n, m, t, start, allGood, currNode, currDist;
int intrare[NMAX], iesire[NMAX];
vector< pair<int, int> > graf[NMAX];
set< pair<int, int> > heap;

void dijkstra() {
    for(int i = 1; i <= n; ++i) iesire[i] = INF;
    iesire[start] = 0;
    heap.insert(make_pair(start, 0));

    while(heap.size()) {
        currNode = (*heap.begin()).first;
        currDist = (*heap.begin()).second;
        heap.erase((*heap.begin()));
        for(int i = 0; i < graf[currNode].size(); ++i) {
            if(iesire[graf[currNode][i].first] > currDist + graf[currNode][i].second) {
                iesire[graf[currNode][i].first] = currDist + graf[currNode][i].second;
                heap.insert(make_pair(graf[currNode][i].first, iesire[graf[currNode][i].first]));
            }
        }
    }
}

int main() {
    freopen("distante.in", "r", stdin);
    freopen("distante.out", "w", stdout);

    int x, y, c;

    scanf("%d", &t);
    while(t--) {
        for(int i = 1; i <= n; ++i) {
            graf[i].clear();
        }
        heap.clear();

        scanf("%d%d%d", &n, &m, &start);
        for(int i = 1; i <= n; ++i) {
            scanf("%d", &intrare[i]);
        }
        for(int i = 0; i < m; ++i) {
            scanf("%d%d%d", &x, &y, &c);
            graf[x].push_back(make_pair(y, c));
            graf[y].push_back(make_pair(x, c));
        }

        dijkstra();

        allGood = 1;
        for(int i = 1; i <= n; ++i) {
            if(intrare[i] != iesire[i]) {
                allGood = 0;
                break;
            }
        }

        printf("%s\n", allGood ? "YES" : "NO");
    }

    return 0;
}