Cod sursa(job #780897)

Utilizator PatrikStepan Patrik Patrik Data 22 august 2012 21:05:25
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
	#include<stdio.h>
	#include<vector>
	#define MAX 50001
	#define inf 1001
	using namespace std;
	FILE *f , *g ;
	int h[MAX] , p[MAX] , d[MAX] , n , m , q ;
	vector<int>a[MAX] , c[MAX];
	vector<int>::iterator it ,it2;
	
	void citire();
	void dijkstra();
	void coborare(int n);
	void urcare(int n);
	void swap(int x , int y);
	void tipar();
	
	int main()
	{
		citire();
		dijkstra();
		tipar();
		return 0;
	}
	
	void citire()
	{
		int x , y , cost;
		f=fopen("dijkstra.in" , "r");
		fscanf(f , "%d%d" , &n , &m );
		for(int i = 1 ; i<= m ; ++i )
		{
			fscanf(f , "%d%d%d" , &x , &y , &cost );
			a[x].push_back(y) , a[y].push_back(x) , c[x].push_back(cost) , c[y].push_back(cost) ;
		}
		fclose(f);
	}
	
	void dijkstra()
	{
		for( int i = 1 ; i<= n  ;++i)
			d[i] = inf , p[i] = i , h[i] = inf;
		q = n;
		d[1] = 0 , h[1] = 0;
		while(q)
		{
			int aux = h[1] , poz = p[1];
			for( it = a[poz].begin(), it2 = c[poz].begin() ; it < a[poz].end() ; it++ , it2++ )
				if(d[*it] > aux + *it2)
				{
					d[*it] = aux+ *it2;
					h[p[*it]] = d[*it] ;
					urcare(p[*it]);
					coborare(p[*it]);
				}
			h[1] = h[q];
			p[1] = p[q--];
			coborare(1);
		}
	}
	
	void swap(int x , int y)
	{
		int aux;
		aux = h[x];
		h[x] = h[y];
		h[y] = aux;
	}
	
	void urcare(int n)
	{
		while(h[n] < h[n/2] && n/2 )
		{
			p[n] = n/2;
			p[n/2] = n;
			swap(n,n/2);
			n = n/2;
		}
	}
	
	void coborare(int n)
	{
		while((h[n] > h[2*n] && 2*n <= q) || (h[n] > h[2*n+1] && 2*n+1 <= q))
			if(h[2*n+1] < h[2*n] && 2*n+1 <= q)
			{
				p[n] = p[2*n+1];
				p[2*n+1] =p[n];
				swap(n,2*n+1);
				n =2*n+1;
			}
			else
			{
				p[n] = p[2*n];
				p[2*n] = p[n];
				swap(n,2*n);
				n = 2*n;
			}
	}
	
	void tipar()
	{
		g=fopen("dijkstra.out" , "w");
		for( int i = 2 ; i<= n ; ++i )
			if(d[i]!=inf)
				fprintf(g , "%d " , d[i]);
			else
				fprintf(g , "0 ");
		fclose(g);
	}