Cod sursa(job #1248811)

Utilizator bulbulicaAlexandrescu Cristian bulbulica Data 26 octombrie 2014 01:34:58
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.37 kb
#include <fstream>
#include <cmath>
#define inf 9999999
using namespace std;

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

const int maxn = 50005;
int n, m;
int d[maxn], h[maxn], poz[maxn], k, sursa, d1[maxn];

struct graf
{
    int nod, cost;
    graf *urm;
};

graf *a[maxn];
 void add(int where, int what, int cost)
{
    graf *q = new graf;
    q->nod = what;
    q->cost = cost;
    q->urm = a[where];
    a[where] = q;
}
void citire()
{
    f>>n>>m;
    int x,y,z;
    while(m--)
    {
        f>>x>>y>>z;
        add(x,y,z);
        add(y,x,z);
    }
}
void inversare(int i, int j)
{
     swap(h[i], h[j]);
     poz[h[i]] = i;
     poz[h[j]] = j;
}
void heap_sus(int k)
{
     if (k == 1) return;
     int t = k/2;
     if (d[h[k]] < d[h[t]])
     {
         inversare(k, t);
         heap_sus(t);
     }
}
void heap_jos(int k, int l)
{
     if (2*k <= l)
     {
        int i = 2*k;
        if (i+1 <= l && d[h[i+1]] < d[h[i]]) i++;
        if (d[h[k]] > d[h[i]])
        {
            inversare(k, i);
            heap_jos(i, l);
        }
     }
}
void construire_heap(int k)
{
     int i;
     for (i = 1; i <= k; i++)
         heap_sus(i);
}
int extrage_min()
{
     int min = h[1];
     inversare(1, k);
     poz[h[k]] = 0;
     --k;
     heap_jos(1, k);
     return min;
}
void dijkstra()
{
    int i, j, dist;
    graf *p;

    for (i = 1; i <= n; i++)
    {
        d[i] = inf;
        h[i] = i, poz[i] = i;
    }

    k = n;
    d[sursa] = 0;
    construire_heap(k);

    while (k)
    {
        i = extrage_min();
        if (d[i] != d1[i])
        {
            g << "NU\n";
            return;
        }
        for (p = a[i]; p; p = p->urm)
        {
             j = p->nod;
             dist = p->cost;
             if (d[j] > d[i] + dist)
             {
                  d[j] = d[i] + dist;
                  heap_sus(poz[j]);
             }
        }
    }
    g << "DA\n";
}
int main()
{
    int i, j1, T, cost, m, v1, v2;
    f >> T;
    for (j1 = 1; j1 <= T; j1++)
    {
        f >> n >> m >> sursa;
        for (i = 1; i <= n; i++)
            f >> d1[i];
        for (i = 1; i <= m; i++)
        {
            f >> v1 >> v2 >> cost;
            add(v1, v2, cost);
            add(v2, v1, cost);
        }
        dijkstra();
    }
    return 0;
}