Cod sursa(job #276570)

Utilizator gabor_oliviu1991gaboru corupt gabor_oliviu1991 Data 11 martie 2009 11:17:45
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.8 kb
#include<stdio.h>
#include<string.h>
#define N 50005
#define INF 30000

struct nod{int info, cost;
           nod *urm;} *prim[N], *p;
           
struct nod_c{int val;
             nod_c *next;} *first, *last, *q;
             
int dist[N], n , m;

void bellman(int sursa);

void init()
{
     for(int i = 1; i <= n; i++)
           prim[i] = NULL;
}
           

int main()
{
          freopen("distante.in","r",stdin);
          freopen("distante.out","w",stdout);
          
          int T, k, d[N], x, y, c, sursa, ok, i; 
          
          scanf("%d", &T);
          
          for(k = 1; k <= T; k++)
          {
                  scanf("%d %d %d", &n, &m, &sursa);
		          init();
                  memset(d, 0, sizeof(d));

                  for(i = 1; i <= n; i++)
                        scanf("%d", &d[i]);
                  for(i = 1; i <= m; i++)
                  {
                          scanf("%d %d %d",&x, &y, &c);
                          
                          p = new nod;
                          p->info = y;
                          p->cost = c;
			              p->urm = prim[x];
                          prim[x] = p;
                          
                          p = new nod;
                          p->info = x;
                          p->cost = c;
                          p->urm = prim[y];
                          prim[y] = p;
                  }
		          bellman(sursa);
                  ok = 1;
                  for(i = 1; i <= n; i++)
                        if(dist[i] != d[i])
                                   ok = 0;
                                  
                  if(ok == 0)
                        printf("NU\n");
                  else
                        printf("DA\n");
          }
          return 0;
}

void bellman(int sursa)
{
		 int viz[N], nod_cur;

		 memset(dist, INF, sizeof(dist));
		 memset(viz, 0, sizeof(viz));

		 dist[sursa] = 0;
		 first = new nod_c;
		 first->val = sursa;
		 first->next = NULL;
		 last = first;
		 viz[sursa] = 1;

		 while(first != NULL)
		 {
				nod_cur = first->val;
				viz[nod_cur] = 0;
				for(p = prim[nod_cur]; p; p = p->urm)
				      if(dist[nod_cur] + p->cost < dist[p->info])
                      {
						       dist[p->info] = p->cost + dist[nod_cur];
                               if(viz[p->info] == 0)
                               {
                                       q = new nod_c;
								       q->val = p->info;
								       q->next = NULL;
								       last->next = q;
								       last = q;
								       viz[p->info] = 1;
                               }
                      }
               q = first;
               first = first->next;
               delete q;
          }
}