Cod sursa(job #1209633)

Utilizator rogoz.bogdanRogoz Bogdan rogoz.bogdan Data 18 iulie 2014 10:57:45
Problema Distante Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>
#include <vector>
#include <queue>
#define MX 50001
using namespace std;

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

struct muc
{
    int j,c;
};
vector<muc> v[MX];
int r1[MX], r2[MX], t, n, m, s;

struct comp
{
    bool operator() (int a, int b)
    {
        return r2[a] > r2[b];
    }
};

priority_queue<int, vector<int>, comp> q;

void citire()
{
    fin>>n>>m>>s;
    int i,x,y,c;
    muc e;

    for(i=1; i<=n; i++) fin>>r1[i];

    for(i=1; i<=m; i++)
    {
        fin>>x>>y>>c;
        e.j = y;
        e.c = c;
        v[x].push_back(e);

        e.j = x;
        v[y].push_back(e);
    }
}

void init()
{
    int i;
    for(i=1; i<=n; i++) r2[i] = 2000000000;

    r2[s] = 0;
}

void dijkstra()
{
    q.push(s);
    vector<muc>::iterator it;
    int u;
    muc e;

    while(!q.empty())
    {
        u = q.top();
        q.pop();

        for(it=v[u].begin(); it!=v[u].end(); it++)
        {
            e = *it;
            if(r2[u] + e.c < r2[e.j])
            {
                r2[e.j] = r2[u] + e.c;
                q.push(e.j);
            }
        }
    }

}

void tipar()
{
    int i;
    for(i=1; i<=n; i++)
    {
        if(r1[i] != r2[i])
        {
            fout<<"NU\n";
            return;
        }
    }

    fout<<"DA\n";
}

int main()
{
    int i,j;
    fin>>t;

    for(i=1; i<=t; i++)
    {
        citire();
        init();
        dijkstra();
        tipar();
        for(j=1; j<=n; j++) v[j].clear();
    }

    fin.close(); fout.close();
    return 0;
}