Cod sursa(job #2908898)

Utilizator TeoRoGaming_YgVoinea Ionut-Florin TeoRoGaming_Yg Data 6 iunie 2022 21:19:23
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <bits/stdc++.h>

using namespace std;

string fisier = "distante";

ifstream f(fisier+".in");
ofstream g(fisier+".out");

const int CMAX = 5e4+15;
const int oo = 2147483647;

int n, m, start, x, y, c;
int nr_graf;
int D[CMAX];
bool viz[CMAX];
bool ok = 0;
int distante[CMAX];
vector < pair < int, int > > graf[CMAX];

struct cmp
{
    bool operator()(int x, int y)
    {
        return D[x] > D[y];
    }
};

priority_queue < int, vector < int >, cmp > Q;

void dijkstra(vector < pair < int, int > > graf[], int start)
{
    D[start] = 0;
    viz[start] = 1;
    Q.push(start);
    while(!Q.empty() && ok==1)
    {
        int nod_curent = Q.top();
        if(D[nod_curent]<distante[nod_curent])
        {
            ok = 0;
        }
        Q.pop();
        for(int i=0; i<graf[nod_curent].size() && ok==1; i++)
        {
            int vecin = graf[nod_curent][i].first;
            int cost  = graf[nod_curent][i].second;
            if(D[nod_curent]+cost<D[vecin])
            {
                D[vecin] = D[nod_curent] + cost;
                Q.push(vecin);
            }
        }
    }
    while(!Q.empty())
        Q.pop();
}

bool comparare(int D[], int distante[])
{
    for(int i=1; i<=n; i++)
        if(D[i]!=distante[i])
            return false;
    return true;
}

int main()
{
    f >> nr_graf;
    for(int temp=1; temp<=nr_graf; temp++)
    {
        f >> n >> m >> start;
        for(int j=1; j<=n; j++)
        {
            f >> distante[j];
            D[j] = oo;
            viz[j] = 0;
            graf[j].clear();
        }
        for(int j=1; j<=m; j++)
        {
            f >> x >> y >> c;
            graf[x].push_back({y,c});
            graf[y].push_back({x,c});
        }
        ok = 1;
        dijkstra(graf,start);
        if(comparare(D,distante)==false)
            g << "NU" << '\n';
        else
            g << "DA" << '\n';
    }
    return 0;
}