Cod sursa(job #372480)

Utilizator loginLogin Iustin Anca login Data 10 decembrie 2009 15:07:55
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
# include <cstdio>
# include <iostream>
# include <cstdlib>
using namespace std;
struct nod {
	int info;
	nod *next;};
int *a[50003], d[50003], n, m, t, s, dd[50003], *c[50003];

int bfs (int s)
{
	nod *st, *dr;
	int k;
	st=dr=new nod;
	st->info=s;
	st->next=NULL;
	d[s]=0;
	while (st)
	{
		k=st->info;
		nod *q;
		for (int i=1;i<=a[k][0];i++)
			if (d[a[k][i]]==-1 || d[k]+c[k][i]<d[a[k][i]])
			{
				d[a[k][i]]=d[k]+c[k][i];
				q=new nod;
				q->next=NULL;
				q->info=a[k][i];
				dr->next=q;
				dr=q;
			}
		if (dd[st->info]!=d[st->info])
			return 0;
		q=st;
		st=st->next;
		delete q;
	}
	return 1;
}

int main ()
{
	int i=1, j=1;
	FILE *fin=fopen("distante.in", "r");
	FILE *fout=fopen("distante.out", "w");
	fscanf(fin, "%d", &t);
	for (int k=1;k<=t;k++)
	{
		fscanf(fin, "%d", &n);
		fscanf(fin, "%d", &m);
		fscanf(fin, "%d", &s);
		for (j=1;j<=n;j++)
			fscanf(fin, "%d", &dd[j]);
		for (i=1;i<=n;i++)  
        {  
			c[i]=(int*) malloc(1*4);
			a[i]=(int*) malloc(1*4);
            a[i][0]=0, d[i]=-1;
        }
        for (;m;--m)
        {
            int x, y, q;
            fscanf(fin, "%d", &x);
            fscanf(fin, "%d", &y);
            fscanf(fin, "%d", &q);
            a[x][0]++;
            c[x]=(int *) realloc(c[x], (a[x][0]+1)*4); 
            a[x]=(int *) realloc(a[x], (a[x][0]+1)*4);
            a[x][a[x][0]]=y;
            c[x][a[x][0]]=q;
            a[y][0]++;
            c[y]=(int *) realloc(c[y], (a[y][0]+1)*4); 
            a[y]=(int *) realloc(a[y], (a[y][0]+1)*4);
            a[y][a[y][0]]=x;
            c[y][a[y][0]]=q;
		}
		int r; 
		r=bfs(s);
		if(r) fprintf(fout, "DA\n");
		else fprintf(fout, "NU\n");
	}
	return 0;
}