Cod sursa(job #3227463)

Utilizator Edis9955Suliman Edis Edis9955 Data 30 aprilie 2024 21:43:40
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <algorithm>
#include <vector>
#include <fstream>
#include <iostream>
#include <queue>
using namespace std;

ifstream fin("distante.in");
ofstream fout("distante.out");
void calc_graf() {
    int N, M, F;
    int a,b,d;
    fin >> N >> M >> F;
    vector<int> didate;
    vector<int> dicalc;
    vector<int> adj[200001],dimuchii;

    //initializare
    for (int i = 0; i <= N; i++ ) {
        didate.push_back(0);
        dicalc.push_back(9999999);
    }
    for (int i = 1; i <= N; i++ ) {
        fin >> didate[i];
    }
    for (int i = 0; i < M; i++ ) {
        fin >> a >> b >> d;
        adj[2 * a].push_back(b);
        adj[2 * a + 1].push_back(d);
        adj[2 * b].push_back(a);
        adj[2 * b + 1].push_back(d);
        dimuchii.push_back(d);
    }
    queue<int> q;
    int di, node, vecin, diplu;
    q.push(F);
    q.push(0);
    dicalc[F] = 0;
    while(!q.empty()){
        node = q.front();
        q.pop();
        di = q.front();
        q.pop();
        // fout<<endl;
        //adaug vecini in coada
        for (int i = 0; i < size(adj[node * 2 ]); i++ ) {
            i = i;
            vecin = adj[2 * node][i];
            //distanta pana la vecin
            diplu = adj[2 * node + 1][i];
            // cout << node << " " << vecin << endl;
            //am gasit un drum/drum mai scurt
            if( di + diplu < dicalc[vecin] ) {
                dicalc[vecin] = di + diplu;
                q.push(vecin);
                q.push(di + diplu);
            }
            // fout << vecin << " ";
        }
        // fout << adj[ 2 * node][0] << " "<< adj[2 * node+1][0];
        // fout<<endl;
    }



    int ok = 1;
    for (int i = 1; i <= N; i++ ) {
        if( didate[i] != dicalc[i ]) ok = 0;
    }
    if(ok) fout << "DA" << endl;
    else fout << "NU" << endl;

    // for (int i = 1; i <= N; i++ ) {
    //     fout << didate[i] << " ";
    // }fout<<endl;
    // for (int i = 1; i <= N; i++ ) {
    //     fout << dicalc[i] << " ";
    // }

}
int main() {
    int n;
    fin >> n;
    for(int i = 1; i <= n; i++) {
        calc_graf();
    }
    return 0;
}