Cod sursa(job #28812)

Utilizator rusRus Sergiu rus Data 8 martie 2007 12:13:42
Problema Distante Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.3 kb
#include<stdio.h>
using namespace std;
typedef struct nod
{
	int info,cost;

	nod*urm;

	}*pnod,NOD;

pnod l[50001],prim,ultim;

long int d[50001],t[50001],s[50001],sol[50001];
long int sir[50001],teste,m,start;
int n,k,nr=0;

void citire();

void add(long int ,long int ,long int );
//void add1(long int ,long int );
void dijkstra();

void afisare();

int main()

{
	freopen("distante.in","r",stdin);
	freopen("distante.out","w",stdout);
    citire();

	//dijkstra();

	//afisare();

	return 0;
}
void citire()

{
	int i;
    scanf("%d",&teste);
	for(i=1;i<=teste;i++)
	{
                     
                     scanf("%d %d %d",&n,&m,&start);
                     for(int j=1;j<=n;j++)
                     scanf("%d",&sir[j]);
                     
                     for (int j = 1; j <= n; j++ )
                         l[j] = NULL;
	                 int v1,v2,cost;

	                 for(int k=1;k<=m;k++)
	                 {
                             scanf("%d %d %d",&v1,&v2,&cost);
                             add(v1,v2,cost);
                             add(v2,v1,cost);
                      }       
                      dijkstra();
                      afisare ();
	}

	//fin.close();
}
void add(long int i,long int j,long int cost)

{
	pnod p=new NOD;

	p->info=j;

	p->cost=cost;

	p->urm=l[i];

	l[i]=p;

}
void dijkstra()

{
	int max=32000,i;

	for(int i=1;i<=n;i++)
    {
            d[i]=max;
            s[i] = 0;
    }

	for(pnod p=l[start];p;p=p->urm)
	{
    	d[p->info]=p->cost;
	    //add1(p->info,p->cost);
        //t[p->info]=start;
    }
    
	d[start]=0;
    s[start]=1;

	t[start]=0;

	for(int pas=1;pas<n;pas++)
	{
		int min=32000;
		//for(pnod p=prim;p;p=p->urm)
    		for(i=1;i<=n;i++)
            if(!s[i] && d[i]<min)
        	{
		    	min=d[i];
		     	k=i;
       		}
		s[k]=1;

		for(pnod p=l[k];p;p=p->urm)
    		if(!s[p->info] && (d[p->info]>d[k]+p->cost))
       		{
	     		d[p->info]=d[k]+p->cost;
        		t[p->info]=k;
		    }
	}  
}
void afisare()

{
     long int i,nrsol=0;
     for(i=1;i<=n;i++)
          if(sir[i]!=d[i])
          //nrsol++;
          break;
          if(i==n+1)
          printf("DA\n");
          else
          printf("NU\n");
     
}