Cod sursa(job #2829211)

Utilizator miruna_avramAvram Miruna miruna_avram Data 8 ianuarie 2022 13:31:44
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");

struct compare{
    bool operator()(const pair<int,int> &a, const pair<int,int> &b){
        return a.second>b.second; //compar dupa cost
    }
};

int T; //cat grafuri sunt pe foaie;
int n,m,s;
int d[50001];

vector<pair<int,int>> v[50001]; //de ex 1: (2,3) unde 3 este costul
priority_queue<pair<int,int>,vector<pair<int,int>>,compare>heap;
int x,y,cost;
int dist[50001],viz[50001];

void add(int node1,int node2,int cost){
    v[node1].push_back(make_pair(node2,cost));
}

void dijkstra(int node){
    viz[node]=1;

    for(int i=0;i<v[node].size();i++){
        if(viz[v[node][i].first]==0) //parcurg lista de adiacenta si vad daca a fost vizitat fiecare nod
//bag in heap (u,v,cost(u,v))
        {

            heap.push(make_pair(v[node][i].first,v[node][i].second+dist[node]));

        }
    }
    while(heap.size()!=0){
        pair<int,int> top;
        top=heap.top();
        heap.pop();

        if(viz[top.first]== 0) //u e in apm, dar v nu
        {
            dist[top.first]=top.second;
            dijkstra(top.first);
        }

    }

}

int main(){
    int ok=1;

    f>>T;
    f>>n>>m>>s;

    for(int i=1;i<=n;i++)
    {
        f>>d[i];
    }

    while(T>0) {
        for (int i = 0; i < m; i++) {
            f >> x >> y >> cost;
            add(x, y, cost);
        }
        for (int i = 0; i < n; i++) {
            dist[i] = 0;
        }
        dijkstra(s);

        for (int i = 1; i <= n; i++) {
            if (dist[i] != d[i])
                //g<<dist[i]<<" ";
                ok = 0;
        }

        if (ok == 0)
            g << "NU";
        else
            g << "DA";
        g<<'\n';

        T--;

        for(int i=1;i<=n;i++)
        {
            v[i].clear();
        }

        for(int i=0;i<=n;i++)
            viz[i]=0;
        while(heap.size() !=0)
        {
            heap.pop();
        }
        ok=1;
    }
}