Cod sursa(job #216153)

Utilizator mihaipoascaPoasca Mihai mihaipoasca Data 22 octombrie 2008 22:56:07
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include<stdio.h>
#define inf 2000000
#define Nmax 50005
#define Mmax 100005

FILE *fin = fopen("distante.in","r"),
    *fout = fopen("distante.out","w");

int T,N,M,S,sol[Nmax];
int dist[Nmax];
char viz[Nmax];


struct nod{int vec,cost;nod* next;};
typedef nod* lista;
lista l[Nmax];

struct elem{int nod;elem* next;};
typedef elem* coada;
coada Q,Qf;

int valid(){
    for(int i=1;i<=N;i++)
        if(dist[i]!=sol[i])
            return 0;
    return 1;
}

int main(){
    fscanf(fin,"%d",&T);
    while(T--){
        fscanf(fin,"%d%d%d",&N,&M,&S);

        for(int i=1;i<=N;i++)
            fscanf(fin,"%d",&sol[i]);

        for(int i=1;i<=M;i++){
            int x,y,d;
            fscanf(fin,"%d %d %d",&x,&y,&d);
            lista aux=new nod;
            aux->vec=y;
            aux->cost=d;
            aux->next=l[x];
            l[x]=aux;

            aux=new nod;
            aux->vec=x;
            aux->cost=d;
            aux->next=l[y];
            l[y]=aux;
        }

        for(int i=1;i<=N;i++)
            dist[i]=inf;
        dist[S]=0;

        Q=Qf=new elem;
        Q->nod=S;
        Q->next=NULL;
        viz[S]=1;

        while(Q){

            int crt=Q->nod;

            for(lista p=l[crt];p;p=p->next)
                if(dist[p->vec] > dist[crt]+p->cost){
                    dist[p->vec]=dist[crt]+p->cost;
                    if(viz[p->vec]==0){
                        viz[p->vec]=1;
                        Qf->next=new elem;
                        Qf=Qf->next;
                        Qf->nod=p->vec;
                        Qf->next=NULL;
                    }
                }

            viz[crt]=0;
            coada aux=Q;
            Q=Q->next;
            delete aux;
        }

    if(valid())
        fprintf(fout,"DA\n");
    else fprintf(fout,"NU\n");

    }

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