Cod sursa(job #1610200)

Utilizator zertixMaradin Octavian zertix Data 23 februarie 2016 12:39:53
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#define inf 0x3f3f3f3f
#include <cstring>
using namespace std;

int n,m,s;
int vec[50005],dist[50005],t;
vector <pair <int ,int > > g[50005];
priority_queue<pair < int ,int > > q;
void dijkstra();
void citire()
{
    for (int i=1;i<=n;++i)
        g[i].clear();
    scanf("%d%d%d",&n,&m,&s);
    for (int i=1;i<=n;++i)
        scanf("%d",&vec[i]);
    for (int i=1;i<=m;++i)
    {
        int nod1,nod2,c;
        scanf("%d%d%d",&nod1,&nod2,&c);
        g[nod1].push_back(make_pair(nod2,c));
        g[nod2].push_back(make_pair(nod1,c));
    }
    q.push(make_pair(0,s));
    memset(dist,inf,sizeof(dist));
}
void dijkstra()
{
    while (!q.empty())
    {
        int d=-q.top().first;
        int nod=q.top().second;
        q.pop();

        for (vector <pair <int ,int > >:: iterator it=g[nod].begin();it!=g[nod].end();++it)
            if (dist[it->first] > it->second+d)
            {
                dist[it->first]=it->second+d;
                q.push(make_pair(-dist[it->first],it->first));
            }
    }
}
int solve()
{
    citire();
    dijkstra();
    dist[1]=0;
    for (int i=1;i<=n;++i)
        if (vec[i]!=dist[i])
        return 0;
    return 1;
}
int main()
{
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    scanf("%d",&t);
    for (int i=1;i<=t;++i)
        {
            if (solve())
                printf("DA\n");
            else
                printf("NU\n");
        }

    return 0;
}