Cod sursa(job #2654606)

Utilizator DanutAldeaDanut Aldea DanutAldea Data 1 octombrie 2020 18:36:58
Problema Distante Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <fstream>
#include <vector>
#include <set>
#define x first
#define y second
#define inf 2000000
using namespace std;

ifstream fin("distante.in");
ofstream fout("distante.out");

int t,n,m,i,j,d[50001],q[50001],src,x,y,cost;
vector <pair <int,int> > l[50001];
set <pair<int,int> > s;
pair<int,int> nod, vec;

int main(){
    for(fin>>t; t; t--){
        s.clear();

        fin>>n>>m>>src;
        for(i=1;i<=n;i++){
            fin>>q[i];
            d[i]=inf;

            while(!l[i].empty())
                l[i].pop_back();
        }
        d[src]=0;

        for(i=1;i<=m;i++){
            fin>>x>>y>>cost;
            l[x].push_back(make_pair(y,cost));
            l[y].push_back(make_pair(x,cost));
        }

        s.insert(make_pair(0,src));

        while(!s.empty()){
            nod=make_pair(s.begin()->x,s.begin()->y);
            s.erase(s.begin());

            for(i=0;i<l[nod.y].size();i++){
                vec=l[nod.y][i];

                if(d[vec.x]>nod.x+vec.y){
                    s.erase(make_pair(d[vec.x],vec.x));
                    d[vec.x]=nod.x+vec.y;
                    s.insert(make_pair(d[vec.x],vec.x));
                }
            }
        }

        for(i=1;i<=n;i++)
            if(q[i]!=d[i])
                break;

        if(i<=n)
            fout<<"NU\n";
        else
            fout<<"DA\n";
    }

    return 0;
}