Cod sursa(job #144921)

Utilizator damaDamaschin Mihai dama Data 28 februarie 2008 09:23:28
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <stdio.h>
#include <vector>

const int inf = 1 << 30;

using namespace std;

vector<int> v[50001], cost[50001];
int d[50001], h[50001], ph[50001], n, m; 

void dijkstra(int);
void riseup(int);
void godown(int);

int main()
{
	freopen("dijkstra.in", "r", stdin);
	freopen("dijkstra.out", "w", stdout);

	int i, a, b, c;

	scanf("%d %d", &n, &m);

	for(i = 1; i <= m; ++i)
	{
		scanf("%d %d %d", &a, &b, &c);
		v[a].push_back(b);
		v[b].push_back(a);
		cost[a].push_back(c);
		cost[b].push_back(c);
	}
	dijkstra(1);

	for(i = 2; i <= n; ++i)
	{
		if(d[i] == inf)
			d[i] = 0;
		printf("%d ", d[i]);
	}

	return 0;
}

void dijkstra(int nod)
{
	int i, sz;

	for(i = 1; i <= n; ++i)
	{
		d[i] = inf;
		h[++h[0]] = i;
		ph[i] = i;
	}
	d[1] = 0;
	for(i = n / 2; i > 0; --i)
	{
		godown(i);
	}
	while(h[0])
	{
	/*	
		for(i = 1; i <= n; ++i)
		{
			printf("%d %d\n", i, d[i]);
		}
		printf("\n");
	*/	
		sz = v[h[1]].size();
		for(i = 0; i < sz; ++i)
		{
			if(d[v[h[1]][i]] > d[h[1]] + cost[h[1]][i])
			{
				d[v[h[1]][i]] = d[h[1]] + cost[h[1]][i];
			}
			riseup(ph[v[h[1]][i]]);
		}
		h[1] = h[h[0]];
		ph[h[1]] = 1;
		--h[0];
		godown(1);
	}
}

void godown(int pos)
{
	int l = 2 * pos, r = 2 * pos + 1, best = pos, temp;

	if(l <= h[0] && d[h[l]] < d[h[best]])
	{
		best = l;
	}
	if(r <= h[0] && d[h[r]] < d[h[best]])
	{
		best = r;
	}
	if(best != pos)
	{
		temp = h[best];
		h[best] = h[pos];
		h[pos] = temp;
		ph[h[pos]] = pos;
		ph[h[best]] = best;
		godown(best);
	}
}

void riseup(int pos)
{
	int temp;
	if(pos != 1)
	{
		if(d[h[pos]] < d[h[pos / 2]])
		{
			temp = h[pos];
			h[pos] = h[pos / 2];
			h[pos / 2] = temp;
			ph[h[pos]] = pos;
			ph[h[pos / 2]] = pos / 2;
			riseup(pos / 2);
		}
	}
}