Cod sursa(job #2576526)

Utilizator MihneaGhiraMihnea MihneaGhira Data 6 martie 2020 20:11:51
Problema Distante Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.87 kb
#include<fstream>
#include<vector>
#include<set>
#include<cstring>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int T,n,m,root,x,y,c;
int D[50010],bronzarel[50010];
char numar[50];
vector < pair<int,int> > L[50010];
multiset < pair<int,int> > s;

int read(){
    fin>>numar;
    int val=0;
    int n=strlen(numar);
    for(int i=0;i<n;i++)
        val=val*10+(numar[i]-'0');
    return val;
}

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();
            }

        n=read();
        m=read();
        root=read();
        for(int i=1;i<=n;i++){
            bronzarel[i]=read();
            D[i]=1000000000;
        }
        for(int i=1;i<=m;i++){
            x=read();
            y=read();
            c=read();
            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;
}