Cod sursa(job #2375988)

Utilizator Horea_Mihai_SilaghiHorea Mihai Silaghi Horea_Mihai_Silaghi Data 8 martie 2019 13:14:25
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <bits/stdc++.h>
#define maxn 50003
#define INF 1000000000
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
vector <pair<int,int> > v[maxn];
int n,m,st;
int dist[maxn],rez[maxn];
void citire()
{
    int i,x,y,val;
    in>>n>>m>>st;
    for(i=1;i<=n;i++)
        in>>rez[i];
    for(i=1;i<=m;i++)
    {
        in>>x>>y>>val;
        v[x].push_back(make_pair(y,val));
        v[y].push_back(make_pair(x,val));
    }
}
int main()
{
    int test,t,i;
    in>>t;
    for(test=1;test<=t;test++)
    {
        citire();
        for(i=1;i<=n;i++)
            dist[i]=INF;
        dist[st]=0;
        set<pair<int,int> >h;
        h.insert(make_pair(0,st));
        while(!h.empty())
        {
            int node=h.begin()->second;
            int d=h.begin()->first;
            h.erase(h.begin());
            for(vector<pair<int,int> >::iterator it=v[node].begin();it!=v[node].end();it++)
            {
                int to=it->first;
                int cost=it->second;
                if(dist[to]>dist[node]+cost)
                {
                    if(dist[to]!=INF)
                        h.erase(h.find(make_pair(dist[to],to)));
                    dist[to]=dist[node]+cost;
                    h.insert(make_pair(dist[to],to));
                }
            }
        }
        int ok=1;
        for(i=1;i<=n;i++)
            if(dist[i]!=rez[i])
                ok=0;
        if(ok==1)
            out<<"DA"<<'\n';
        else
            out<<"NU"<<'\n';
        for(i=1;i<=n;i++)
            v[i].clear();
    }
    return 0;
}