Cod sursa(job #496416)

Utilizator vlad.maneaVlad Manea vlad.manea Data 28 octombrie 2010 21:47:05
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
// 

#include <fstream>
#include <queue>
using namespace std;

#define NMax 50000
#define Inf 2000000000

int N, M;
int D[NMax], P[NMax], *G[NMax], *C[NMax];
queue<int> Q;

void read()
{
	int u, v, c;
	ifstream fin;
	fin.open("dijkstra.in", fstream::in);
	fin >> N >> M;
	for (int k = 0; k < M; ++k)
	{
		fin >> u >> v >> c;
		++D[u - 1];
	}
	for (int i = 0; i < N; ++i)
	{
		G[i] = (int*)realloc(G[i], D[i] * sizeof(int));
		C[i] = (int*)realloc(C[i], D[i] * sizeof(int));
		D[i] = 0;
	}
	fin.close();
	fin.open("dijkstra.in", fstream::in);
	fin >> N >> M;
	for (int k = 0; k < M; ++k)
	{
		fin >> u >> v >> c;
		G[u - 1][D[u - 1]] = v - 1;
		C[u - 1][D[u - 1]] = c;
		++D[u - 1];
	}
	fin.close();
}

void solve()
{
	int u, v, c;
	for (int i = 1; i < N; ++i)
		P[i] = Inf;
	Q.push(0);
	while (!Q.empty())
	{
		u = Q.front();
		Q.pop();
		for (int i = 0; i < D[u]; ++i)
		{
			v = G[u][i];
			c = C[u][i];
			if (P[v] > P[u] + c)
			{
				P[v] = P[u] + c;
				Q.push(v);
			}
		}
	}
}

void write()
{
	ofstream fout("dijkstra.out");
	for (int i = 1; i < N; ++i)
		fout << P[i] << ' ';
	fout << '\n';
	fout.close();
}

int main()
{
	read();
	solve();
	write();
	return 0;
}