Cod sursa(job #2302919)

Utilizator catalina200029Olteanu Catalina catalina200029 Data 15 decembrie 2018 11:36:17
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <bits/stdc++.h>
#define NMAX 50005
#define inf 1e9

using namespace std;

FILE*f=fopen("distante.in","r");
FILE*g=fopen("distante.out","w");

vector<pair<int,int> > v[NMAX];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > h;
int n,m,d[NMAX],viz[NMAX],x,y,z,s,nod,d2[NMAX],k;
bool ok;

int main() {
    int i,j;
    fscanf(f,"%d",&k);
    for (j=1;j<=k;j++) {

        for (i=1;i<=n;i++) v[i].clear();

        fscanf(f,"%d%d%d",&n,&m,&s);
        for (i=1;i<=n;i++) fscanf(f,"%d",&d2[i]);
        for (i=1;i<=m;i++) {
            fscanf(f,"%d%d%d",&x,&y,&z);
            v[x].push_back(make_pair(z,y));
            v[y].push_back(make_pair(z,x));
        }

        for (i=1;i<=n;i++) {
            d[i]=inf;
            viz[i]=0;
        }
        d[s]=0;
        h.push(make_pair(0,s));

        while (!h.empty()) {
            nod=h.top().second;
            h.pop();
            if (!viz[nod]) {
                for (i=0;i<v[nod].size();i++)
                    if (v[nod][i].first+d[nod]<d[v[nod][i].second]) {
                        d[v[nod][i].second]=v[nod][i].first+d[nod];
                        h.push(make_pair(d[v[nod][i].second],v[nod][i].second));
                    }
            }
            viz[nod]=1;
        }
        ok=true;
        for (i=1;i<=n && ok;i++)
            if (d[i]!=d2[i]) ok=false;
        if (ok) fprintf(g,"DA\n");
        else fprintf(g,"NU\n");
    }
    return 0;
}