Cod sursa(job #1166719)

Utilizator ChallengeMurtaza Alexandru Challenge Data 3 aprilie 2014 19:26:07
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.1 kb
#include <fstream>
#include <vector>

using namespace std;

const char InFile[] = "dijkstra.in";
const char OutFile[] = "dijkstra.out";
const int MaxN = 50111;
const int AINT_SIZE = MaxN * 4;
const int INF = 1<<30;

ifstream fin(InFile);
ofstream fout(OutFile);

struct AINT_NODE
{
	int val, node;
};

struct EdgeTo
{
	EdgeTo(int to=0, int cost=0):to(to),cost(cost){}
	int to, cost;
};

int N, M, x, y, cost, D[MaxN], viz[MaxN];
AINT_NODE AINT[AINT_SIZE];
vector<EdgeTo> G[MaxN];

void Init(int nod, int st, int dr)
{
	if (st == dr)
	{
		AINT[nod].val = D[st];
		AINT[nod].node = st;
		return;
	}

	int mid = (st+dr)>>1;
	int left = nod << 1;
	int right = left + 1;

	Init(left,st,mid);
	Init(right,mid+1,dr);

	AINT[nod] = AINT[right];
	if (AINT[left].val < AINT[right].val)
	{
		AINT[nod] = AINT[left];
	}
}

int update_node, update_val;
void Update(int nod, int st, int dr)
{
	if (st == dr)
	{
		AINT[nod].val = update_val;
		return;
	}

	int mid = (st+dr)>>1;
	int left = nod<<1;
	int right = left + 1;

	if (update_node <= mid)
	{
		Update(left, st, mid);
	}
	else
	{
		Update(right, mid + 1, dr);
	}

	AINT[nod] = AINT[right];
	if (AINT[left].val < AINT[right].val)
	{
		AINT[nod] = AINT[left];
	}
}

int main()
{
	fin >> N >> M;
	for (register int i = 1; i <= M; ++i)
	{
		fin >> x >> y >> cost;
		G[x].push_back(EdgeTo(y, cost));
		G[y].push_back(EdgeTo(x, cost));
	}
	fin.close();

	for (register int i = 2; i <= N; ++i)
	{
		D[i] = INF;
	}
	Init(1,1,N);

	while (AINT[1].val!=INF)
	{
		int node = AINT[1].node;
		update_node = node;
		update_val = INF;
		Update(1,1,N);
		viz[node] = 1;
		for (vector<EdgeTo>::iterator it = G[node].begin(); it != G[node].end(); ++it)
		{
			if (!viz[it->to])
			{
				if (D[it->to] > D[node] + it->cost)
				{
					D[it->to] = D[node] + it->cost;
					update_node = it->to;
					update_val = D[it->to];
					Update(1,1,N);
				}
			}
		}
	}

	for (register int i = 2; i <= N; ++i)
	{
		if (D[i] == INF)
		{
			D[i] = 0;
		}
		fout << D[i] << " ";
	}
	fout.close();
	return 0;
}