Cod sursa(job #1988052)

Utilizator victoreVictor Popa victore Data 1 iunie 2017 22:33:24
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include<cstdio>
#include<vector>
#include<queue>

using namespace std;

const int nmax=50005;
const int inf=1e9;

typedef pair<int,int> ii;

priority_queue< ii , vector<ii> , greater<ii> > pq;
vector<ii>g[nmax];
int dist[nmax],n,m,deverif[nmax];

int main()
{
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    int i,x,y,t,c,s;
    scanf("%d",&t);
    while(t)
    {
        scanf("%d%d%d",&n,&m,&s);
        for(i=1;i<=n;i++)
            scanf("%d",&deverif[i]);
        for(i=1;i<=n;i++)
        {
            scanf("%d%d%d",&x,&y,&c);
            g[x].push_back(ii(y,c));
            g[y].push_back(ii(x,c));
        }
        while(!pq.empty())
            pq.pop();
        for(i=1;i<=n;++i)
            dist[i]=inf;
        dist[s]=0;
        pq.push(ii(0,s));
        int node,cost,currnode,sz,currcost;
        while(!pq.empty())
        {
            cost=pq.top().first;
            node=pq.top().second;
            pq.pop();
            if(cost>dist[node])
                continue;
            sz=g[node].size();
            for(i=0;i<sz;++i)
            {
                currnode=g[node][i].first;
                currcost=g[node][i].second;
                if(dist[node]+currcost<dist[currnode])
                {
                    dist[currnode]=dist[node]+currcost;
                    pq.push(ii(dist[currnode],currnode));
                }
            }
        }
        bool a=0;
        for(i=1;i<=n;i++)
            if(dist[i]!=deverif[i])
            {
                a=1;
                break;
            }
        if(a)
            printf("NU\n");
        else
            printf("DA\n");
        --t;
    }
}