Cod sursa(job #401105)

Utilizator otilia_sOtilia Stretcu otilia_s Data 22 februarie 2010 13:55:40
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include <vector>
using namespace std;
const int NMAX=50003;
const int oo=60000003;
struct nod {int v; short c;};
vector <nod> A[NMAX];
vector <int> d;
int nv[NMAX],n,nh,H[NMAX];

void citire()
{
	ifstream fin("dijkstra.in");
	int m,i;
	fin>>n>>m;
	memset (nv,0, (n+1)*sizeof(int));
	for (i=1;i<=m;++i)
	{ int x,y; short c; nod z;
	  fin>>x>>z.v>>z.c;  ++nv[x];
	  A[x].push_back(z);	  
	}
	fin.close();
}

void sift(int k)
{ int fiu;
	do
	{
		fiu=k<<1; 
		if (fiu<=nh)
			{
				if (fiu+1<nh)
					if (d[H[fiu+1]]<d[H[fiu]]) fiu++;
				if (d[k]>d[fiu]) {
									int aux=H[fiu]; H[fiu]=H[k]; H[k]=aux;
									k=fiu;
								 }
						else fiu=0;
			}
		   else fiu=0;
	}
	while (fiu);
}

void percolate(int k)
{
	int val=H[k];
	while ((k>1)&&(val<H[k>>1]))
	 { H[k]=H[k>>1]; k>>=1;}
	H[k]=val;
}


void calc()
{
	bool viz[NMAX]; d.resize(n+1,oo);
	memset(viz,0,sizeof(viz));
	d[1]=0; nh=1; H[1]=1;			
	while (nh)
	{ int m,i,x;
		m=H[1]; H[1]=H[nh--]; sift(1); 
		viz[m]=true;
		for (i=0;i<nv[m];++i)
		{ x=A[m][i].v;
		 if (!viz[x])
			if (d[x]>d[m]+A[m][i].c)
		       { d[x]=d[m]+A[m][i].c; 
				 H[++nh]=x; percolate(nh);
			   }	
		}		
	}	
}

void afisare()
{
	ofstream fout("dijkstra.out");
	for (int i=2;i<=n;++i)
		if (d[i]==oo) fout<<"0 ";
			else fout<<d[i]<<" ";
	fout.close();
}

int main()
{
	citire();
	calc();
	afisare();		
	return 0;
}