Cod sursa(job #1478036)

Utilizator metrix007Lungu Ioan Adrian metrix007 Data 27 august 2015 17:02:03
Problema Distante Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#include <algorithm>
#include <queue>
#include <utility>
#define NMAX 50005
#define INF 5000
#define nod second
#define cost first
using namespace std;

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

int n,m,t,xx,yy,s,cc,dc[NMAX],d[NMAX],val,y;

vector<int> a[NMAX],c[NMAX];
priority_queue< pair<int,int> > T;
void init()
{
    in >> n >> m >> s;
    for(int i=1;i<=n;i++)
    {
        d[i]=INF;
        a[i].clear();
        c[i].clear();
    }
}

void citire()
{
    for(int i=1;i<=n;i++)
        in >> dc[i];

    for(int i=0;i<m;i++)
    {
        in >> xx >> yy >> cc;
        a[xx].push_back(yy);
        a[yy].push_back(xx);
        c[xx].push_back(cc);
        c[yy].push_back(cc);
    }
    d[s]=0;
}

void dijkstra()
{
    T.push(make_pair(0,s));
    while(!T.empty())
    {
        val = T.top().cost;
        y = T.top().nod;
        T.pop();
        for(int i=0;i<a[y].size();i++)
        {
            if(d[a[y][i]]> val + c[y][i])
            {
                d[a[y][i]]= val + c[y][i];
                T.push(make_pair(d[a[y][i]],a[y][i]));
            }
        }
    }
}

void afisare()
{
    for(int i=1;i<=n;i++)
        if(d[i]!=dc[i])
    {
        out << "NU\n";
        return;
    }
    out << "DA\n";
}

int main()
{
    in >> t;
    for(int i=0;i<t;i++)
    {
        init();
        citire();
        dijkstra();
        afisare();
    }
    return 0;
}