Cod sursa(job #1144707)

Utilizator andreiagAndrei Galusca andreiag Data 17 martie 2014 14:52:19
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <string.h>

using namespace std;
const int Nmax = 50005;
const int INF = 0x3f3f3f3f;
typedef pair<int, int> pii;

vector<pii> G[Nmax];
queue<int> Q;
int inQ[Nmax];      // 0-1 daca virful respectiv se afla in queue
int dist[Nmax];     // distantele corecte
int target[Nmax];   // distantele calculate de Bronzarel


int main()
{
    ifstream f ("distante.in");
    ofstream g ("distante.out");

    int T, N, M, S, a, b, w;
    f >> T;
    for (int t = 0; t < T; t++)
    {
        f >> N >> M >> S;
        S--;
        memset(dist, INF, sizeof(dist));
        memset(inQ, 0, sizeof(inQ));
        //Q.clear();

        for (int i = 0; i < N; i++)
            G[i].clear();
        for (int i = 0; i < N; i++)
            f >> target[i];
        for (int e = 0; e < M; e++) {
            f >> a >> b >> w;
            G[a-1].push_back(make_pair(b-1, w));
        }

        dist[S] = 0;
        inQ[S] = 1;
        Q.push(S);

        while (!Q.empty()) {
            int a = Q.front(); Q.pop();
            inQ[a] = 0;
            for (auto x: G[a]) {
                if (dist[x.first] > dist[a] + x.second) {
                    dist[x.first] = dist[a] + x.second;
                    if (!inQ[x.first]) {
                        inQ[x.first] = 1;
                        Q.push(x.first);
                    }
                }
            }
        }
        bool ok = 1;
        for (int i = 0; i < N; i++)
            if (dist[i] != target[i]) {
                ok = false;
                break;
            }
        if (ok) g << "DA\n";
        else    g << "NU\n";
    }


    return 0;
}