Cod sursa(job #475900)

Utilizator vlad.maneaVlad Manea vlad.manea Data 9 august 2010 00:26:54
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 2.1 kb
#include <fstream>
#include <vector>
#define nmax 50005

using namespace std;

int N, M;
vector<int> Neig[nmax], Cost[nmax];

void read()
{
	int x, y, c;
	ifstream fin("dijkstra.in");

	fin >> N >> M;
	
	while (M--)
	{
		fin >> x >> y >> c;
		Neig[x].push_back(y);
		Cost[x].push_back(c);
	}

	fin.close();
}

void push(int k, int Heap[], int Dist[], int Wher[])
{
	int i;

	Heap[++Heap[0]] = k;

	for (i = Heap[0]; i > 1 && Dist[Heap[i >> 1]] > Dist[k]; i >>= 1)
	{
		Wher[Heap[i] = Heap[i >> 1]] = i;
	}

	Wher[Heap[i] = k] = i;
}

bool empty(int Heap[])
{
	return Heap[0] == 0;
}

int pop(int Heap[], int Dist[], int Wher[])
{
	int k = Heap[1], i = 1, j = Heap[1] = Heap[Heap[0]--], m, p;

	while (Heap[0] >= (i << 1))
	{
		m = Dist[Heap[i << 1]];
		p = i << 1;

		if (Heap[0] >= (i << 1 | 1) && Dist[Heap[i << 1 | 1]] < m)
		{
			m = Dist[Heap[i << 1 | 1]];
			++p;
		}

		if (m < Dist[j])
		{
			Wher[Heap[i] = Heap[p]] = i;
			i = p;
		}
		else
		{
			break;
		}
	}

	Wher[Heap[i] = j] = i;
	return k;
}

void update(int k, int Heap[], int Dist[], int Wher[])
{
	int i;

	for (i = Wher[k]; i > 1 && Dist[Heap[i >> 1]] > Dist[k]; i >>= 1)
	{
		Wher[Heap[i] = Heap[i >> 1]] = i;
	}

	Wher[Heap[i] = k] = i;
}

void solve(int Dist[])
{
	int i, u, d; 	
	int f = numeric_limits<int>::max();
	int Heap[nmax], Wher[nmax];
	bool Visi[nmax];

	for (i = 2, Heap[1] = Wher[1] = 1, Dist[1] = 0, Visi[1] = false, Heap[0] = N; i <= N; ++i)
	{
		Dist[i] = f;
		Heap[i] = Wher[i] = i;
		Visi[i] = false;
	}

	while (!empty(Heap))
	{
		Visi[u = pop(Heap, Dist, Wher)] = true;

		if (Dist[u] == f)
		{
			break;
		}

		for (i = 0; i < Neig[u].size(); ++i)
		{
			if (!Visi[Neig[u][i]])
			{
				if ((d = Dist[u] + Cost[u][i]) < Dist[Neig[u][i]])
				{
					Dist[Neig[u][i]] = d;
					update(Neig[u][i], Heap, Dist, Wher);
				}
			}
		}
	}

	for (i = 2; i <= N; ++i)
	{
		if (Dist[i] == f)
		{
			Dist[i] = 0;
		}
	}
}

void write(int Dist[])
{
	int i;
	ofstream fout("dijkstra.out");

	for (i = 2; i <= N; ++i)
	{
		fout << Dist[i] << ' ';
	}

	fout << '\n';
	fout.close();
}

int main()
{
	int Dist[nmax];

	read();
	solve(Dist);
	write(Dist);
	return 0;
}