Cod sursa(job #2679214)

Utilizator mihaistamatescuMihai Stamatescu mihaistamatescu Data 29 noiembrie 2020 23:00:39
Problema Distante Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <fstream>
#include <vector>
#include <set>
#define INF 2000000000
using namespace std;
vector <pair<int, int> >L[50010];
set <pair<long long, int> >s;
int n,m,i,x,y,c,st,k,ok,t,T;
int D[100010],verifD[50010],dc[50010];
int main() {
    ifstream fin("distante.in");
    ofstream fout("distante.out");
    fin>>T;
    for (t=1;t<=T;t++){
        fin>>n>>m>>st;
        for (i=1;i<=n;i++){
            fin>>verifD[i];
        }
        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));
        }
        for (i=1;i<=n;i++){
            D[i]=INF;
        }
        D[st]=0;
        s.insert(make_pair(0,st));
        while (!s.empty()){
            k=s.begin()->second;
            s.erase(s.begin());
            for (i=0;i<L[k].size();i++){
                if (D[L[k][i].first]>D[k]+L[k][i].second){
                    s.erase ( make_pair(D[L[k][i].first],L[k][i].first));
                    D[L[k][i].first]=D[k]+L[k][i].second;
                    s.insert (make_pair(D[L[k][i].first],L[k][i].first));
                }
            }
        }
        ok=1;
        for (i=1;i<=n;i++){
            if (D[i]!=verifD[i]){
                ok=0;
                break;
            }
        }
        if (ok==0){
            fout<<"NU\n";
        }
        else{
            fout<<"DA\n";
        }
        for (i=1;i<=n;i++){
            L[i].clear();
        }
    }
    return 0;
}