Cod sursa(job #461718)

Utilizator S7012MYPetru Trimbitas S7012MY Data 8 iunie 2010 13:27:54
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <cstdio>
#include <cstring>
#include <deque>
using namespace std;
#define DN 50001
#define INFI 0x3f3f3f3f

int viz[DN],dist[DN],n,m,cdist[DN];
deque <int> coada;

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

void adaugare (int x, int y, int cost,nod *v[DN]) {
    nod *p;
    p=new nod;
    p->x=y;
    p->cost=cost;
    p->urm=v[x];
    v[x]=p;
}

void initializareSU(int sursa,nod *v[DN]) {
    int i;
    for(i=1; i<=n; i++) viz[i]=0, dist[i]=INFI;
    dist[sursa]=0;
    viz[sursa]=1;
    coada.push_back(sursa);
}

void bellman_ford(nod *v[DN]) {
    nod *p;
    int i;
    for( ; coada.size(); coada.pop_front()) {
        //viz[coada.front()]=0;
        for(p=v[coada.front()]; p!=NULL; p=p->urm)
            if(dist[p->x]>dist[coada.front()]+p->cost) {//relaxare
                dist[p->x]=dist[coada.front()]+p->cost;
                if(!viz[p->x]) {
                    coada.push_back(p->x);
                    //viz[p->x]=1;
                }
            }
    }
    for(i=1; i<=n; i++) if(dist[i]!=cdist[i]) {
        printf("NU\n");
        return;
    }
    printf("DA\n");
}

void rezolva(int sursa) {
    int j,x,y,c;
    nod *v[DN];
     initializareSU(sursa,v);
        for(j=1; j<=n; j++) scanf("%d",&cdist[j]);
        for(j=1; j<=m; j++) {
            scanf("%d %d %d",&x ,&y ,&c );
            adaugare(x,y,c,v);
            adaugare(y,x,c,v);
        }
        bellman_ford(v);
}

int main()
{
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    int i,t,sursa;
    scanf("%d",&t);
    for(i=1; i<=t; i++) {
        scanf("%d %d %d",&n ,&m,&sursa);
        rezolva(sursa);

    }
    return 0;
}