Cod sursa(job #2828371)

Utilizator AndreeaGeamanuAndreea AndreeaGeamanu Data 7 ianuarie 2022 10:02:38
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <iostream>
#include <fstream>
#include <bits/stdc++.h>

const int inf = 0x3f3f3f3f;
#define nmax 50005
#define mmax 100005
#define cmax 1005

using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");


vector <pair<int,int>> la[nmax];
int dist[nmax];
//set <pair<int,int>> s;

void dijkstra(int ns){
    // Se seteaza vectorul de distante minime cu inf
    memset(dist, inf, sizeof(dist));
    dist[ns]=0;
    int viz[nmax]={0};
    viz[ns]=1;
    priority_queue <pair<int,int>> pq;

    // Se adauga nodul de start in set
    pq.push(make_pair(-dist[ns],ns));

    while(!pq.empty()){
        pair<int, int> top = pq.top();
        int nod = top.second;
        int dmin = -top.first;
        pq.pop();

        // Pentru fiecare vecin al nodului curent se actualizeaza distanta minima
       // if(viz[nod]==0){
       //     viz[nod]=1;
            for(int k=0; k<la[nod].size(); k++){
                int nod2 = la[nod][k].first;
                int cost = la[nod][k].second;
                if(dmin+cost< dist[nod2]){
                    dist[nod2] = dmin+cost;
                    pq.push(make_pair(-dist[nod2], nod2));
                }
            }

    }
}

int main()
{
    int t,n,m,s,x,y,c,d[nmax];

    f>>t;

    for(int i=0; i<t; i++){
        // Citirea datelor
        f>>n>>m>>s;

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

        for(int k=0; k<m; k++){
            f>>x>>y>>c;
            la[x].push_back(make_pair(y,c));
            la[y].push_back(make_pair(x,c));
        }

        // In vectorul dist se obtine solutia dupa apelarea functiei dijkstra()
        dijkstra(s);

        // Se verifica daca solutia obtinuta este aceeasi cu solutia citita din fisier
        int ok=1;
        for(int l=1; l<=n; l++){
            if(dist[l]==inf && d[l]!=0) ok=0;
            else if(dist[l]!=d[l]) ok=0;
        }

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

        // Se elibereaza la[nmax] pentru citirea urmatorului graf
        for(int h=1; h<=n; h++){
            la[h].clear();
        }

    }


    f.close();
    g.close();
    return 0;
}