Cod sursa(job #120243)

Utilizator QbyxEros Lorand Qbyx Data 4 ianuarie 2008 18:21:55
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <stdio.h>
#include <string.h>

struct adj{unsigned int no; long int x;} nod[50010][100];
unsigned int t, n, m, s, ok; 
long int dis[50010];

int main()
{
    FILE *f, *g;
    int i, x, y, d, j, k;
    
    f = fopen("distante.in", "rt");
    g = fopen("distante.out", "wt");
    fscanf(f, "%d", &t);

    for (k = 1; k <= t; k++)
    {
        fscanf(f, "%d %d %d\n", &n, &m, &s);
	for (i = 1; i <= n; i++)
	    fscanf(f, "%d", &dis[i]);
        for (i = 1; i <= m; i++)
	{
	    fscanf(f, "%d %d %d\n", &x, &y, &d);
       	    nod[x][0].no++;
	    nod[x][nod[x][0].no].no = y;
	    nod[x][nod[x][0].no].x = d;

	    nod[y][0].no++;
	    nod[y][nod[y][0].no].no = x;
	    nod[y][nod[y][0].no].x = d;
        }

        i = 1;
	ok = 1;
        while (ok && i <= n)
	{
	    if (i != s) ok = 0; else ok = 1;
	    for (j = 1; j <= nod[i][0].no; j++)
		if (i != s)
		if (dis[nod[i][j].no] + nod[i][j].x == dis[i]) ok = 1;
	    for (j = 1; j <= nod[i][0].no; j++)
		if (dis[nod[i][j].no] + nod[i][j].x < dis[i]) ok = 0;
	    i++;
	}

	if (ok) fprintf(g, "%s\n", "DA");
	else fprintf(g, "%s\n", "NU");
    }
    fclose(f);
    fclose(g);
}