Cod sursa(job #486338)

Utilizator Cristy94Buleandra Cristian Cristy94 Data 21 septembrie 2010 10:19:58
Problema Algoritmul lui Dijkstra Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include<stdio.h>
#include<vector>
#define inf 2000000000
FILE *f=fopen("dijkstra.in","r");
FILE *g=fopen("dijkstra.out","w");
using namespace std;
int n,m,k,i,x,y,z,j,heapn;
int minim,p;
int s[50001];
int d[50001];
vector< pair<int,int> > a[50001];

void downheap(int p){
	//init
	int l,r;
	while(2*p<=n){
		minim=p;
		l=2*p;
		r=2*p+1;
		if(d[minim]>d[l])
			 minim=l;
		if(r<=n&&d[minim]>d[r])
			 minim=r;
		//interschimbam
		if(minim!=p){
			 int t=d[p];
			 d[p]=d[minim];
			 d[minim]=t;
		}
		else break;
	}
}

void upheap(int p){
	int t;
	while(p>1){
		t=p/2;
		if(d[p]<d[t]){
			int m=d[p];
			d[p]=d[t];
			d[t]=m;
		}
	  else break;
	}
}

int main(){
	fscanf(f,"%d%d",&n,&m);

//citire
for(i=1;i<=m;i++){
	fscanf(f,"%d%d%d",&x,&y,&z);
	a[x].push_back(make_pair(y,z));
}
//d=inf
for(i=1;i<=n;i++)
	d[i]=inf;

//d[i]= distanta de la nod1 la nodi
for(i=0;i<=a[1].size()-1 ;i++){
	heapn++;
	d[a[1][i].first]=a[1][i].second;
}
//selectam primul nod
s[1]=1;
//rezolvare N2
for(k=2;k<n;k++){
	//reint
	minim=inf; p=0;
	//cel mai apropiat nod la care se poate ajunge
    for(i=1;i<=n;i++)
	 if( s[i]==0 && d[i]<minim)
	 {  minim=d[i];
	    p=i;
	 }
 //selectam nodul
 s[p]=1;
 //minimul pana la toti vecinii
  for(i=0;i<=(int)a[p].size()-1;i++)
	  if(s[a[p][i].first]==0 && d[p] +a[p][i].second < d[a[p][i].first] )
	     d[a[p][i].first]=d[p]+a[p][i].second;	
}
//afisam
for(i=2;i<=n;i++){
	if(d[i]!=inf)
	fprintf(g,"%d ",d[i]);
	else fprintf(g,"%d ",0);
}
return 0;
}