Cod sursa(job #2485312)

Utilizator severutBogdan Sever-Cristian severut Data 1 noiembrie 2019 11:47:56
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define NMAX 50005
using namespace std;
struct Servus{
    int nod,cost;
    bool operator <(const Servus&a)const{
        return cost>a.cost;
    }
};
ifstream in("distante.in");
ofstream out("distante.out");
vector<Servus> v[NMAX];
priority_queue<Servus> q;
int n,m,s,t;
int dist[NMAX],vec[NMAX];
void dickstra(int nod)
{
    memset(dist,0x3f3f3f3f,sizeof dist);
    dist[nod]=0;
    q.push({nod,0});
    while(!q.empty()){
        int fata=q.top().nod;
        q.pop();
        for(auto i:v[fata]){
            if(dist[fata]+i.cost<dist[i.nod]){
                dist[i.nod]=dist[fata]+i.cost;
                q.push({i.nod,dist[i.nod]});
            }
        }
    }
}
int main()
{
    int x,y,z;
    int ok=0;
    in>>t;
    for(int i=1;i<=t;++i){
        ok=0;
        for(int j=1;j<=n;j++)
            v[j].clear();
        in>>n>>m>>s;
        for(int j=1;j<=n;++j)
            in>>vec[j];
        for(int j=1;j<=m;++j){

            in>>x>>y>>z;
            v[x].push_back({y,z});
            v[y].push_back({x,z});
        }
        dickstra(s);
        for(int j=1;j<=n;++j)
            if(vec[j]!=dist[j])
                ok=1;
        if(ok==0)
            out<<"DA"<<'\n';
        else
            out<<"NU"<<'\n';
    }
    return 0;
}