Cod sursa(job #155705)

Utilizator rethosPaicu Alexandru rethos Data 12 martie 2008 09:15:18
Problema Algoritmul lui Dijkstra Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <stdio.h>
#define NM 500001
#define INF 0xfffffff
long n,m,nr;
long poz[NM];
struct cheste{long x,nod;} d[NM];
struct lista {long cost,vec;lista *urm;} *g[NM];
void swap(long x,long y)
{ cheste aux2=d[x];
  d[x]=d[y];
  d[y]=aux2;
  long aux=poz[d[x].nod];
  poz[d[x].nod]=poz[d[y].nod];
  poz[d[y].nod]=aux;
}
void heap_up(long nod)
{ if (nod==1) return;
  if (d[nod].x<d[nod/2].x)
	{ swap(nod,nod/2);
	  heap_up(nod/2);
	}
}
void heap_down(int nod)
{ long st=nod*2;
  long dr=nod*2+1;
  if (st<=nr&&d[nod].x>d[st].x&&((d[st].x<d[dr].x)||(dr>nr)))
	{ swap(st,nod);
	  heap_down(st);
	}
  else if(dr<=nr&&d[nod].x>d[dr].x&&d[dr].x<d[st].x)
	{ swap(dr,nod);
	  heap_down(dr);
	}
}
long hpop_min()
{ long min=d[1].nod;
  swap(1,nr);
  nr--;
  heap_down(1);
  return min;
}

void dijkstra()
{ int i,min;
  for (i=1;i<=n-1;i++) { d[i].x=INF;d[i].nod=i+1;poz[i+1]=i;}
  lista *p;
  for (p=g[1];p;p=p->urm)
	{ d[poz[p->vec]].x=p->cost;
	  heap_up(poz[p->vec]);
	}
  for (nr=n-1;nr>0;)
	{ min=hpop_min();
	  for (p=g[min];p;p=p->urm)
		{ if (p->cost+d[poz[min]].x<d[poz[p->vec]].x)
			{ d[poz[p->vec]].x=p->cost+d[poz[min]].x;
			  heap_up(poz[p->vec]);
			}
		}
	}
}

int main()
{ freopen("dijkstra.in","rt",stdin);
  freopen("dijkstra.out","wt",stdout);
  scanf("%ld %ld",&n,&m);
  long i,a,b,c;
  lista *p;
  for (i=1;i<=m;i++)
	{ scanf("%ld %ld %ld",&a,&b,&c);
	  p=new lista;
	  p->cost=c;
	  p->vec=b;
	  p->urm=g[a];
	  g[a]=p;
	}
  dijkstra();
  for (i=2;i<=n;i++)
	if (d[poz[i]].x==INF) printf("0 ");
		else printf("%ld ",d[poz[i]].x);
  return 0;
}