Cod sursa(job #2576502)

Utilizator MihneaGhiraMihnea MihneaGhira Data 6 martie 2020 20:00:34
Problema Distante Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 kb
#include<fstream>
#include<vector>
#include<set>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int T,n,m,root,x,y,c;
int D[50010],bronzarel[50010];
vector < pair<int,int> > L[50010];
multiset < pair<int,int> > s;
int main(){
    fin>>T;
    for(int t=1;t<=T;t++){
        while(!s.empty())
            s.erase(s.begin());
        for(int i=1;i<=50001;i++){
            if(!L[i].empty())
                L[i].clear();
            }
        fin>>n>>m>>root;
        for(int i=1;i<=n;i++){
            fin>>bronzarel[i];
            D[i]=1000000000;
        }
        for(int i=1;i<=m;i++){
            fin>>x>>y>>c;
            L[x].push_back( make_pair(y,c) );
            L[y].push_back( make_pair(x,c) );
        }
        D[root]=0;
        s.insert( make_pair(0,root) );
        while(!s.empty()){

            int nod=s.begin()->second;
            s.erase( s.begin() );
            for(int i=0;i<L[nod].size();i++){
                int vecin=L[nod][i].first;
                int cost=L[nod][i].second;
                if(D[vecin]>D[nod]+cost){
                    s.erase({D[vecin],vecin});
                    D[vecin]=D[nod]+cost;
                    s.insert({D[vecin],vecin});
                }
            }
        }
        int ok=0;

        for(int i=1;i<=n;i++){
            if(D[i]==1000000000)
                D[i]=0;
            if(D[i]!=bronzarel[i]){
                fout<<"NU"<<"\n";
                ok=1;
                break;
            }
        }
        if(!ok)
            fout<<"DA"<<"\n";
    }
    return 0;
}