Cod sursa(job #381806)

Utilizator mihaimoldovanMihai Moldovan mihaimoldovan Data 11 ianuarie 2010 17:51:45
Problema Algoritmul lui Dijkstra Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2 kb
using namespace std;
#include<iostream>
#include<fstream>
#define NN 50005
#define infi 1<<30

int v[NN],d[NN],t[NN],n;
int h[NN],nh;//un heap in care tinem minte elementele
int poz[NN];//pozitia in heap a nodului k
struct nod{int capat,cost;
		nod* next;};

nod *g[NN];

void adaugacapat(int i,int j,int c)
{nod *t=new nod;
t->capat=j;
t->cost=c;
t->next=g[i];
g[i]=t;
}

void promoveaza(int k)
{
	int esteh=0,aux,i;
	while(!esteh&&k/2>0)
		{
			i=k/2;
			if(d[h[i]]<=d[h[k]])
				esteh=1;
			else
			{
				aux=h[i];
				h[i]=h[k];
				h[k]=aux;
				poz[h[i]]=i;
				poz[h[k]]=k;
				k=i;
			}
		}
}

void cerne(int k)
{
	int esteh=0,aux,i;
	while(2*k<=nh&&!esteh)
		{
			i=2*k;
			if(i+1<nh&&d[h[i]]>d[h[i+1]])
				i=i+1;
			if(d[h[k]]<=d[h[i]])
				esteh=1;
			else
			{
				aux=h[i];
				h[i]=h[k];
				h[k]=aux;
				poz[h[i]]=i;
				poz[h[k]]=k;
				k=i;
			}
		}
	
}

void dijsktra(int sursa)
{
	for(int i=0;i<=n;i++)//de la 0
		{
			v[i]=0;
			d[i]=infi;
			t[i]=-1;
			h[i]=i;
			poz[i]=i;
		}
		nh=n;
	//initializam sursa cu ce trebuie
	v[sursa]=1;
	d[sursa]=0;
	t[sursa]=0;
	h[sursa]=h[nh--];
	poz[h[sursa]]=sursa;
	for(nod *p=g[sursa] ; p ; p=p->next)
		{
			t[p->capat]=sursa;
			d[p->capat]=p->cost;
			promoveaza(poz[p->capat]);
		}
	//int gata=0;	
	for(int kkk=1;kkk<n;++kkk)
		{
		
			int pmin=0;
			/*for(int i=1;i<=n;++i)
				if(v[i]==0 && d[i]<d[pmin])
					pmin=i;
					 */
			pmin=h[1];
			if(d[pmin]==infi)break;
				v[pmin]=1;
				h[1]=h[nh--];
				poz[h[1]]=1;
				cerne(1);
				for(nod* p=g[pmin];p;p=p->next)
					if(v[p->capat]==0)
						if(d[p->capat]>d[pmin]+p->cost)
							{
								d[p->capat]=d[pmin]+p->cost;
								t[p->capat]=pmin;
								promoveaza(p->capat);
							}
		}
}

int main()
{
	freopen("dijkstra.in","r",stdin);
	int m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		g[i]=NULL;
	int i,j,c;	
	for(;m;m--)
	{
		scanf("%d%d%d",&i,&j,&c);
		adaugacapat(i,j,c);
	}
	dijsktra(1);
	freopen("dijkstra.out","w",stdout);
	for(int i=2;i<=n;i++)
		if(d[i]!=infi)printf("%d ",d[i]);
		else printf("%d ",0);
}