Cod sursa(job #379912)

Utilizator ProcopliucProcopliuc Adrian Procopliuc Data 4 ianuarie 2010 13:06:03
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
# include <fstream.h>

ifstream f ("dijkstra.in");
ofstream g ("dijkstra.out");
int d[200005],i,k,n,m,nrr,min,inf=32000000,x,y,z,nr,sf,v[200005],aux,ok,poz[200005];
struct nod 
{
	int info,cost;
	nod *urm;
}*p,*q,*a[500005];

void sss (int k)
 {
	 if (k/2)
		 if (d[v[k/2]]>d[v[k]])
		 {
			 aux=v[k];
			 v[k]=v[k/2];
			 v[k/2]=aux;
			 poz[v[k]]=k;
			 poz[v[k/2]]=k/2;
			 sss (k/2);
		 }
}

void jjj (int k)
{
	if (2*k+1<=sf)
	{
		if (d[v[2*k]]<d[v[2*k+1]])
			min=2*k;
		else
			min=2*k+1;
		if (d[v[min]]<d[v[k]])
		{
			aux=v[min];
			v[min]=v[k];
			v[k]=aux;
			poz[v[min]]=min;
			poz[v[k]]=k;
			jjj (min);
		}
	}
	else
		if (2*k<=sf)
			if (d[v[2*k]]<d[v[k]])
			{
				aux=v[k];
				v[k]=v[2*k];
				v[2*k]=aux;
				poz[v[k]]=k;
				poz[v[2*k]]=2*k;
			}
}




void adauga (int x)
   {
	   sf++;
	   v[sf]=x;
	   poz[x]=sf;
	   sss (sf);
   }	   

  
	
	

    void mm (int k)
	{ int ok=0;
		if (k/2)
			
				if (d[v[k/2]]>d[v[k]])
				{
					sss (k);
			    	ok=1;
				}
		if (ok==0)
			jjj (k);
	}

	void sterg (int k)
	{
		v[k]=v[sf];
		poz[v[k]]=k;
		sf--;
		mm (k);
	}

	
   




int main ()
{
	f>>n>>m;
	for (i=1;i<=n;i++)
		d[i]=-1;
	for (i=1;i<=m;i++)
	{
		f>>x>>y>>z;
		p=new nod;
		p->info=y;
		p->cost=z;
		p->urm=a[x];
		a[x]=p;
	 if (x==1)
	 {	
		d[y]=z;
	    adauga (y);
	 }
	}
	for (i=1;i<=n;i++)
		if (d[i]==-1)
			d[i]=inf;
	
	k=1;
	while (k<=n)
	{
		
		
		nr=v[1];
		
		sterg (1);
		p=a[nr];
		
		while (p)
		{
			if (d[p->info]==inf)
			{
				d[p->info]=d[nr]+p->cost;
		     adauga (p->info);
			}
			else
				if (d[p->info]>d[nr]+p->cost)
				{
					
					d[p->info]=d[nr]+p->cost;
					sss(poz[p->info]);
				}
		p=p->urm;	
		}
		k++;
	}
	
	for (i=2;i<=n;i++)
		if (d[i]>=inf)
			g<<"0 ";
		else
			g<<d[i]<<" ";
		f.close ();
		g.close ();
		return 0;
}