Cod sursa(job #575253)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 8 aprilie 2011 08:36:44
Problema Algoritmul lui Dijkstra Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <utility>
#include <functional>
#include <algorithm>
#include <cstdio>
#include <vector>
using namespace std;
#define N 50001
vector<pair<int,int> > g[N];//vecinul, costul
int v[N];//0 nevizitat,1 vizitat,2 vizitat si optim
int d[N];
struct Compare
{	bool operator()(const int& a, const int& b)
	{	return d[a]>d[b];	
	}
};

int main ()
{	freopen("dijkstra.in","r",stdin);
	freopen("dijkstra.out","w",stdout);
	int i,j,n,m,a,b,c,mv,iv,ic;
	scanf("%d %d",&n,&m);
	for (i=1;i<=m;i++)
	{	scanf("%d %d %d",&a, &b, &c);
		g[a].push_back(make_pair(b,c));
	}
	vector<int> h;
	d[1]=0;
	v[1]=2;
	for (i=0;i<g[1].size();i++)
	{	iv=g[1][i].first;	
		ic=g[1][i].second;
		h.push_back(iv);
		v[iv]=1;
		d[iv]=ic;	
	}
	make_heap(h.begin(),h.end(),Compare());
	int flag;
	for(i=1;i<n;i++)
	{/*	for(j=0;j<h.size();j++)
		{	printf("%d ",h[j]);
		}
		printf("\n");	*/
		flag=false;
		mv=h[0];
		pop_heap(h.begin(),h.end(),Compare());
		h.pop_back();
		for (j=0;j<g[mv].size();j++)
		{	iv=g[mv][j].first;
			ic=g[mv][j].second;
			if(v[iv]==2)continue;
			if(v[iv])
			{	if(d[iv]>d[mv]+ic)
				{	d[iv]=d[mv]+ic;
					flag=true;
				}
			}
			else
			{	d[iv]=d[mv]+ic;
				v[iv]=1;
				h.push_back(iv);
				if(!flag)
				push_heap(h.begin(),h.end(),Compare());
			}	
		}
		if(flag)
		{	make_heap(h.begin(),h.end(),Compare());
		}
		if(h.size()==0)
		{break;}
	}
	for (i=2;i<=n;i++)
	{	printf("%d ",d[i]);
	}		
	return 0;	
}