Cod sursa(job #1209647)

Utilizator rogoz.bogdanRogoz Bogdan rogoz.bogdan Data 18 iulie 2014 11:14:59
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <cstdlib>
#define MX 50001
using namespace std;

FILE *fin, *fout;

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;
long lsize, poz;
char* buf;

void parsare()
{
    fseek(fin, 0, SEEK_END);
    lsize = ftell(fin);
    rewind(fin);

    buf = (char*) malloc(lsize);
    fread(buf, 1, lsize, fin);
}

int numar()
{
    int nr=0;
    while(buf[poz]<'0' || buf[poz]>'9') poz++;
    while(buf[poz]>='0' && buf[poz]<='9')
    {
        nr = nr*10 + buf[poz] - '0';
        poz++;
    }

    return nr;
}

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

    for(i=1; i<=n; i++)
    {
        r1[i] = numar();
    }

    for(i=1; i<=m; i++)
    {
        x = numar();
        y = numar();
        c = numar();

        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])
        {
            fprintf(fout, "NU\n");
            return;
        }
    }

    fprintf(fout, "DA\n");
}

int main()
{
    fin = fopen("distante.in", "r");
    fout = fopen("distante.out", "w");

    int i,j;
    parsare();
    t = numar();

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

    free(buf);
    fclose(fin); fclose(fout);
    return 0;
}