Cod sursa(job #8966)

Utilizator rusRus Sergiu rus Data 25 ianuarie 2007 23:27:13
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.34 kb
#include<fstream>
using namespace std;
ifstream fin("distante.in");

ofstream fout("distante.out");

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()

{
	citire();

	//dijkstra();

	//afisare();

	return 0;
}
void citire()

{
	int i;
    fin>>teste;
	for(i=1;i<=teste;i++)
	{
                     
                     fin>>n>>m>>start;
                     for(int j=1;j<=n;j++)
                     fin>>sir[j];
                     
                     for (int j = 1; j <= n; j++ )
                         l[j] = NULL;
	                 int v1,v2,cost;

	                 for(int k=1;k<=m;k++)
	                 {
                             fin>>v1>>v2>>cost;
                             add(v1,v2,cost);
                             add(v2,v1,cost);
                      }       
                      dijkstra();
                      afisare ();
	}

	fin.close();
}
void add1(long int i,long int cost)
{
    pnod p = new NOD;
    p->info = i;
    p->cost=cost;
    p->urm= prim;
    prim = p;
}
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)
    		if(!s[p->info] && d[p->info]<min)
        	{
		    	min=d[p->info];
		     	k=p->info;
       		}
		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;
     for(i=1;i<=n;i++)
          if(sir[i]!=d[i])
          break;
          if(i==n+1)
          fout<<"DA"<<"\n";
          else
          fout<<"NU"<<"\n";
     
}