Cod sursa(job #188342)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 7 mai 2008 22:57:22
Problema Distante Scor 60
Compilator c Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <stdlib.h>
#include <stdio.h>
#define N 50010
#define T 15
#define INF 250000010
int dist[N],n,m,cati[N],d[N];
struct nod{
	int cine,cost;
};
int cat[T][N];
int incoada[N];
int coada[500000];
int t,s,cnt;
void start(){
    int c,i,j,z;;
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
	scanf("%d",&t);
	for (z=1;z<=t;++z){
          scanf("%d%d%d",&n,&m,&s);
          for (i=1;i<=n;++i){
              cat[z][i]=0;
              scanf("%d",&d[i]);
          }
          while (m--){
                scanf("%d%d%d",&i,&j,&c);
                ++cat[z][i];
                ++cat[z][j];
          }
    }
    fclose(stdin);
    freopen("distante.in","r",stdin);
    scanf("%d",&t);
}
void do_job(){
    int i,j,c;
    int *cine[N],*cost[N];
    int p,u;
    int e,now;
	scanf("%d%d%d",&n,&m,&s);
    for (i=1;i<=n;++i){
        cati[i]=0;
        scanf("%d",&d[i]);
    }
    for (i=1;i<=n;++i){
       dist[i]=INF;
       cine[i]=(int*)malloc(cat[cnt][i]*sizeof(int));
       cost[i]=(int*)malloc(cat[cnt][i]*sizeof(int));
       cati[i]=0;
    }
    while (m--){
          scanf("%d%d%d",&i,&j,&c);
          ++cati[i];
          cine[i][cati[i]]=j;
          cost[i][cati[i]]=c;
          ++cati[j];
          cine[j][cati[j]]=i;
          cost[j][cati[j]]=c;
    }
    p=u=0;
    coada[u++]=s;
    dist[s]=0;
    while ((p^u)!=0){
      e=coada[p++];
      incoada[e]=0;
      for (i=1;i<=cati[e];++i){
         now=cine[e][i];
         if(dist[now] > dist[e] + cost[e][i]){
            dist[now] = dist[e] + cost[e][i];
            if (!incoada[now]){
              incoada[now]=1;
              coada[u++]=now;
            }
         }
      }
    }
}
void print(){
    int i,j,ok=1;
    for (i=1;i<=n && ok;++i)
        if (dist[i]!=d[i])
           ok=0;
    if (ok)
       printf("DA\n");
    else
        printf("NU\n");
}
void end(){
    fclose(stdin);
    fclose(stdout);
    exit(0);
}
int main(){
    start();
    for (cnt=1;cnt<=t;++cnt){
          do_job();
          print();
    }
    end();
}