Cod sursa(job #1321943)

Utilizator andreeadeacAndreea Ioana Deac andreeadeac Data 19 ianuarie 2015 18:12:52
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <fstream>
#include<vector>
#include<queue>
#define INF 49999001
using namespace std;

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

struct nodul{
    int vf, c;
};

vector<nodul> a[50001];
int n,m,x,rad,poz[50001],h[50001],nh,d[50001],dd[50001];

void schimba (int x, int y){
    int u=h[x];
    h[x]=h[y];
    h[y]=u;
    poz[h[x]]=x;
    poz[h[y]]=y;
}

void coboara(int i){
     int fs = 2*i, fd = 2*i + 1, bun = i;
    if (fs <= nh && d[h[fs]] < d[h[bun]])
        bun = fs;
    if (fd <= nh && d[h[fd]] < d[h[bun]])
        bun = fd;
    if (bun != i) {
        schimba(i, bun);
        coboara(bun);
    }
}
void sterg(int i){
    schimba(i,nh);
    nh--;
    coboara(1);
}


void urc(int i ){
    while(i>=2 && d[h[i]]<d[h[i/2]]){
        schimba(i,i/2);
        i/=2;
    }
}

void adaug(int x)
{
    h[++nh] = x;
    poz[x] = nh;
    urc(nh);
}

void dijkstra(int xnod){
    int y,cost;
    for (int i = 1; i <= n; i++)
            d[i] = INF;
    d[xnod] = 0;
    poz[xnod]=1;
    adaug(xnod);
    while(nh != 0){
        xnod=h[1];
        sterg(1);
        for(unsigned i=0;i<a[xnod].size(); i++){
            y = a[xnod][i].vf;
            cost = a[xnod][i].c;
            if(d[xnod] + cost < d[y]){
                d[y] = d[xnod] + cost;
                if (poz[y] == 0)
                    adaug(y);
                else
                    urc(poz[y]);
            }
        }
        //for (int i = 1; i <= nh; i++)
        //    g << "(" << h[i] << "," << d[h[i]] << ") " ;
        //g << "\n";
    }
}


int main()
{
    int i,na,nb,c,nr;
    f>>nr;
    for(int j=1;j<=nr;j++){
        f>>n>>m>>rad;
        for(i=1;i<=n;i++)
            f>>dd[i];
        for(i=1;i<=m;i++){
            f>>na>>nb>>c;
            a[na].push_back((nodul){nb,c});
        }
        dijkstra(rad);
        int cod=1;
        for(i=1;i<=n;i++){
            if(d[i]!=dd[i])
                cod=0;
        }
        if(cod==0)
            g<<"NU"<<"\n";
        else
            g<<"DA"<<"\n";
    }
    return 0;
}