Cod sursa(job #2344023)

Utilizator dariab2001Daria Broscoteanu dariab2001 Data 14 februarie 2019 17:49:05
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <fstream>
#include <queue>
#include <vector>
#define nmax 50001
#define inf 999999999
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
vector <pair<int,int> > G[nmax];
queue <int> q;
int nr,i,start,n,j,k,m,x,y,z,cost,nod,d[nmax],v[nmax];
bool viz[nmax];
int main()
{
    f>>nr;
    for(i=1;i<=nr;++i)
    {
        f>>n>>m>>start;
        for(j=1; j<=n; ++j)
            f>>v[j];
        for(k=1; k<=m; ++k)
        {
            f>>x>>y>>z;
            G[x].push_back(make_pair(y,z));
            G[y].push_back(make_pair(x,z));
        }
        for(j=1; j<=n; ++j)
            viz[j]=false;
        for(j=1; j<=n; ++j)
            d[j]=inf;
        d[start]=0;
        q.push(start);
        viz[start]=true;
        while(!q.empty())
        {
            x=q.front();
            q.pop();
            viz[x]=false;
            for(unsigned it=0; it<G[x].size(); ++it)
            {
                nod=G[x][it].first;
                cost=G[x][it].second;
                if(d[nod]>d[x]+cost)
                {
                    d[nod]=d[x]+cost;
                    if(viz[nod]==false)
                    {
                        viz[nod]=true;
                        q.push(nod);
                    }
                }
            }
        }
        for(j=1; j<=n; ++j)
            if(d[j]!=v[j])
                break;
        if(j<=n)
            g<<"NU"<<endl;
        else
            g<<"DA"<<endl;
        for(j=1; j<=n; ++j)
            G[j].clear();
    }
    return 0;
}