Cod sursa(job #2041065)

Utilizator luanastLuana Strimbeanu luanast Data 16 octombrie 2017 20:27:14
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <fstream>
#include <vector>
#include <set>
#define inf 100000001LL
using namespace std;
ifstream fin ("distante.in");
ofstream fout ("distante.out");
int T,n,m,i,t,S,x,y,c,dist,nodv,ok,d[50001],bron[50001];
vector <pair<int,int> > L[50001];
multiset <pair<int,int> > s;
int main(){
    fin>>T;
    for(t=1;t<=T;t++){
        fin>>n>>m>>S;
        for(i=1;i<=n;i++){
            fin>>bron[i];
            d[i]=inf;
        }
        for(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[S]=0;
        s.insert(make_pair(0,S));
        while(!s.empty()){
            x=s.begin()->second;
            s.erase(s.begin());
            for(vector <pair<int,int> >::iterator it=L[x].begin();it!=L[x].end();it++){
                nodv=it->first;
                dist=it->second;
                if(d[nodv]>d[x]+dist){
                    s.erase(make_pair(d[nodv],nodv));
                    d[nodv]=d[x]+dist;
                    s.insert(make_pair(d[nodv],nodv));
                }
            }
        }
        ok=1;
        for(i=1;i<=n;i++){
            if(d[i]!=bron[i])
                ok=0;
        }
        if(ok)
            fout<<"DA\n";
        else
            fout<<"NU\n";
    }
    return 0;
}