Cod sursa(job #2085011)

Utilizator ZenoTeodor Anitoaei Zeno Data 9 decembrie 2017 15:27:53
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
// main.cpp : Defines the entry point for the console application.
//

#include <fstream>
#include <cstring>
#include <vector>
#include <queue>
#define NMAX 50001
#define INF 1000000000

using namespace std;

ifstream fin("distante.in");
ofstream fout("distante.out");

int T, n, m, s, dmin[NMAX], sol[NMAX];
vector<int> V[NMAX], C[NMAX];
queue<int> Q;

void bellmanFord(int node) {
    for(int i = 1; i <= n; i++) sol[i] = INF;
    sol[node] = 0;
    Q.push(node);
    while(!Q.empty()) {
        int x = Q.front();
        Q.pop();
        for(int i = 0; i < V[x].size(); i++) {
            if(sol[V[x][i]] > sol[x] + C[x][i]) {
                sol[V[x][i]] = sol[x] + C[x][i];
                Q.push(V[x][i]);
            }
        }
    }
}


int main()
{
	fin >> T;
	while(T--) {
        fin >> n >> m >> s;
        for(int i = 1; i <= n; i++) fin >> dmin[i];
        int a, b, c;
        while(m--) {
            fin >> a >> b >> c;
            V[a].push_back(b);
            V[b].push_back(a);
            C[a].push_back(c);
            C[b].push_back(c);
        }
        bellmanFord(s);
        bool ok = 1;
        for(int i = 1; i <= n && ok; i++) {
            if(dmin[i] != sol[i]) {
                fout << "NU" << '\n';
                ok = 0;
            }
        }
        if(ok)
            fout << "DA" << '\n';
        for(int i = 1; i <= n; i++) {
            if(!V[i].empty())
                V[i].erase(V[i].begin(), V[i].begin() + V[i].size());
            if(!C[i].empty())
                C[i].erase(C[i].begin(), C[i].begin() + C[i].size());
        }
	}
    return 0;
}