Cod sursa(job #1589136)

Utilizator metrix007Lungu Ioan Adrian metrix007 Data 3 februarie 2016 19:53:36
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#define INF 99999999
#define NMAX 50002
using namespace std;

struct punct
{
    int nod,cost;
}p,v;

struct comp{

    bool operator () (punct a, punct b)
    {
        if(a.cost < b.cost)
            return true;
        return false;
    }
};

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

vector<punct> a[NMAX];
set<punct,comp> T;

int n,m,x,y,s,c,t,d[NMAX],ds[NMAX];

bool dijkstra()
{

    d[s] = 0;
    p.nod = s;
    p.cost = 0;

    T.insert(p);
    while(!T.empty())
    {
        p = (*T.begin());
        T.erase(T.begin());
       // cout << p.nod<< " ";

        for(int i=0;i<a[p.nod].size();i++)
        {
            if(d[a[p.nod][i].nod]> p.cost + a[p.nod][i].cost)
            {
                d[a[p.nod][i].nod] = p.cost + a[p.nod][i].cost;
                v.nod = a[p.nod][i].nod;
                v.cost=d[a[p.nod][i].nod];
                T.insert(v);
            }

        }
    }
    for(int i=1;i<=n;i++)
        if(d[i]!=ds[i])
            return false;
    return true;
}

int main()
{
    in >> t;

    for(int k=0;k<t;k++)
    {
        in >> n >> m >> s;
        for(int i=1;i<=n;i++)
        {
            in >> ds[i];
            a[i].clear();
            d[i] = INF;
        }
        for(int i=1;i<=m;i++)
        {
            in >> x >> y >> c;
            p.cost = c;
            p.nod = y;
            a[x].push_back(p);
            p.nod = x;
            a[y].push_back(p);
        }

        if(dijkstra())
            out << "DA" << "\n";
        else out << "NU" << "\n";

    }
   // for(int i=1;i<=n;i++)
       // cout << d[i] << " ";
    return 0;
}