Cod sursa(job #1268342)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 20 noiembrie 2014 20:58:12
Problema Distante Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <stdio.h>
#define MAXN 50000
#define MAXM 100000
int d[MAXN+1], lista[MAXN+1], val[2*MAXM+1], next[2*MAXM+1], q[MAXN+1], ok[MAXN+1], cost[2*MAXM+1], check[MAXN+1], k;
inline void adauga(int a, int b, int c){
    k++;
    cost[k]=c;
    val[k]=b;
    next[k]=lista[a];
    lista[a]=k;
}
int main(){
    int T, t, n, m, s, i, err, st, dr, x, y, p, a, b, c, ck;
    FILE *fin, *fout;
    fin=fopen("distante.in", "r");
    fout=fopen("distante.out", "w");
    fscanf(fin, "%d", &T);
    for(t=1; t<=T; t++){
        fscanf(fin, "%d%d%d", &n, &m, &s);
        for(i=1; i<=n; i++){
            fscanf(fin, "%d", &d[i]);
            check[i]=1;
            lista[i]=0;
        }
        k=0;
        for(i=1; i<=m; i++){
            fscanf(fin, "%d%d%d", &a, &b, &c);
            adauga(a, b, c);
            adauga(b, a, c);
        }
        ck=n-1;
        check[s]=0;
        q[0]=s;
        st=0;
        dr=1;
        err=(d[s]==0);
        ok[s]=t;
        while((err==1)&&(st<dr)){
            x=q[st++];
            p=lista[x];
            while(p!=0){
                y=val[p];
                if(d[x]+cost[p]==d[y]){
                    ck-=check[y];
                    check[y]=0;
                }
                if(d[x]+cost[p]<d[y]){
                    err=0;
                }
                if(ok[y]!=t){
                    ok[y]=t;
                    q[dr++]=y;
                }
                p=next[p];
            }
        }
        err&=(ck==0);
        if(err==0){
            fprintf(fout, "NU\n");
        }else{
            fprintf(fout, "DA\n");
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}