Cod sursa(job #95327)

Utilizator M@2Te4iMatei Misarca M@2Te4i Data 28 octombrie 2007 11:37:17
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include<stdio.h>
#include<string.h>
#define inf 10000
#define val 20000

int n,m,xp,p[val],d[val],s[val],t,c[val][val];

void citire()
{
scanf("%d%d%d", &n, &m, &xp);
for (int o=1; o<=n; o++)
    scanf("%d", &p[o]);
int i,x,y,z;
for (i=1; i<=n; i++)
    for (int j=1; j<=n; j++)
	c[i][j]=inf;
for (i=1; i<=n; i++)
    c[i][i]=0;
for (i=1; i<=m; i++)
    {
    scanf("%d%d%d", &x, &y, &z);
    c[x][y]=z;
    }
}

void min(int &k)
{
int m=2*inf;
for (int i=1; i<=n; i++)
    if (s[i]==0 && d[i]<m)
       {
       m=d[i];
       k=i;
       }
}

void verificare()
{
for (int i=1; i<=n; i++)
    if (d[i]!=p[i])
       {
       printf("NU\n");
       return;
       }
printf("DA\n");
}

void dijkstra()
{
for (int i=1; i<=n; i++)
    {
    d[i]=c[xp][i];
    s[i]=0;
    }
s[xp]=1;
int g=1;
int x=0,k;
while (g==1)
      {
      min(k);
      ++x;
      if (d[k]==inf || x==n)
	 g=0;
	 else
	     {
	     s[k]=1;
	     for (int j=1; j<=n; j++)
		 if (s[j]==0 && d[j]>d[k]+c[k][j])
		    {
		    d[j]=d[k]+c[k][j];
		    }
	     }
      }
}

int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%d", &t);
for (int u=1; u<=t; u++)
    {
    citire();
    dijkstra();
    verificare();
    }
fclose(stdin);
fclose(stdout);
return 0;
}