Cod sursa(job #2656536)

Utilizator mihnea03Ciocioiu Mihnea mihnea03 Data 7 octombrie 2020 22:10:47
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <fstream>
#include <algorithm>
#include <climits>
#include <vector>
#include <deque>
#define dim 50010
using namespace std;
vector<pair<int,int> >a[dim];
deque<int> c;
int f[dim];
int sol[dim];
int d[dim];
int i,n,m,t,s,cost,nod,vecin,ok,x,y;

int main() {
    ifstream fin("distante.in");
    ofstream fout("distante.out");
    fin>>t;
    for (;t--;) {
        c.clear();
        fin>>n>>m>>s;
        for (i=1;i<=n;i++) {
            fin>>sol[i];
        }
        for (i=1;i<=m;i++) {
            fin>>x>>y>>cost;
            a[x].push_back({y,cost});
            a[y].push_back({x,cost});
        }
        c.push_back(s);
        for (i=1;i<=n;i++) {
            d[i]=INT_MAX;
        }
        d[s]=0;
        f[s]=1;
        while (c.empty()!=1) {
            nod=c.front();
            for (i=0;i<a[nod].size();i++) {
                vecin=a[nod][i].first;
                cost=a[nod][i].second;
                if (d[vecin]>d[nod]+cost) {
                    d[vecin]=d[nod]+cost;
                    if (f[vecin]==0) {
                        f[vecin]=1;
                        c.push_back(vecin);
                    }
                }
            }
            f[nod]=0;
            c.pop_front();
        }
        ok=1;
        for (i=1;i<=n;i++) {
            if (d[i]!=sol[i]) {
                ok=0;
                fout<<"NU"<<"\n";
                break;
            }
        }
        if (ok) fout<<"DA"<<"\n";
        for (i=1;i<=n;i++) {
            a[i].clear();
            f[i]=0;
        }
    }
    return 0;
}