Cod sursa(job #2298670)

Utilizator andrei32576Andrei Florea andrei32576 Data 8 decembrie 2018 12:36:35
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <bits/stdc++.h>
using namespace std;

int viz[50005],n,m,i,x,y,c,d[50005],dref[50005],T,t,ns;

struct comp
{
    bool operator() (int x,int y)
    {
        return d[x]>d[y];
    }
};

priority_queue < int, vector<int>, comp > pq;
vector < pair<int,int> > G[50005];
int inf=2000000000;

ifstream f("distante.in");
ofstream g("distante.out");

void dijkstra(int S)
{
    int i;
    for(i=1;i<=n;i++)
        d[i]=inf;
    d[S]=0;
    pq.push(S);
    viz[S]=1;

    while(!pq.empty())
    {
        int nod=pq.top();
        pq.pop();

        viz[nod]=0;
        for(int i=0; i<G[nod].size();i++)
        {
            int nc=G[nod][i].first;
            int cost=G[nod][i].second;

            if(d[nod] + cost < d[nc])
            {
                d[nc] = d[nod] + cost;
                if(viz[nc]==0)
                {
                    pq.push(nc);
                    viz[nc]=1;
                }
            }
        }
    }
}

int main()
{
    f>>T;
    for(t=1;t<=T;t++)
    {
        f>>n>>m>>ns;

        for(i=1;i<=n;i++)
            f>>dref[i];

        for(i=1;i<=m;i++)
        {
            f>>x>>y>>c;
            G[x].push_back(make_pair(y,c));
            G[y].push_back(make_pair(x,c));
        }

        dijkstra(ns);

        int ok=1;
        for(i=1;i<=n && ok==1;i++)
            if(dref[i]!=d[i]) ok=0;

        if(ok==1)
            g<<"DA\n";
        else
            g<<"NU\n";

        //for(i=1;i<=n;i++)
        //    g<<d[i]<<" ";

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

    f.close();
    g.close();
    return 0;
}