Cod sursa(job #2102852)

Utilizator NToniBoSSNicolae Tonitza NToniBoSS Data 9 ianuarie 2018 15:45:20
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <bits/stdc++.h>
#define cost first
#define ad second
using namespace std;
int v[50001],viz[50001],dmin[50001];
int main()
{
    int t,ct,n,m,s,i,a,b,c,z;
    ifstream f("distante.in");
    ofstream g("distante.out");
    f >> t;
    for(ct=0; ct<t; ct++)
    {
        f >> n >> m >> s;
        for(i=1; i<=n; i++)
        {
            f >> v[i];
            viz[i]=0;
            dmin[i]=1000000000;
        }
        vector <pair < int ,int> > L[50001];
        priority_queue <pair <int ,int > > q;
        for(i=0; i<m; i++)
        {
            f >> a >> b >> c;
            L[a].push_back({c,b});
            L[b].push_back({c,a});
        }
        dmin[s]=0;
        q.push({0,s});
        while(!q.empty())
        {
            z=q.top().ad;
            q.pop();
            if(viz[z])
                continue;
            else
                viz[z]=1;
            for(int i=0; i<L[z].size(); i++)
                if(dmin[L[z][i].ad]>dmin[z]+L[z][i].cost)
                {
                    dmin[L[z][i].ad]=dmin[z]+L[z][i].cost;
                    q.push({-dmin[L[z][i].ad],L[z][i].ad});
                }
        }
        for(i=1; i<=n && v[i]==dmin[i]; i++);
        if(i>n) g << "DA\n";
        else g << "NU\n";
        memset(v+1,0,n);
        memset(viz+1,0,n);
        memset(dmin+1,0,n);
        for(i=1; i<=n; i++)
            L[i].clear();
    }

    return 0;
}