Cod sursa(job #1139698)

Utilizator irimiecIrimie Catalin irimiec Data 11 martie 2014 13:27:59
Problema Algoritmul lui Dijkstra Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
#include <iostream>

using namespace std;

ifstream f("dijkstra.in");
ofstream g("dijkstra.out");

const int MAXN=20010, INF = (0x0f0f0f)/2;

int N, M, minim, k;
int c[MAXN][MAXN], selected[MAXN], ant[MAXN], d[MAXN];

void read()
{
	int x, y, cost;
	f >> N >> M;
	for(int i = 1; i <= N; ++i)
		for(int j = 1; j <= N; ++j)
			if(i == j)
				c[i][j] = c[j][i] = 0;
			else
				c[i][j] = c[j][i] = INF;
	for(int i = 0; i < M; ++i)
	{
		f >> x >> y >> cost;
		c[x][y] = cost;
	}
}

void dijkstra()
{
	for(int i = 1; i <= N; ++i)
	{
		d[i] = c[1][i];
		if(d[i] < INF)
			ant[i] = 1;
	}
	
	selected[1] = 1;
	
	for(bool ok = true; ok;)
	{
		minim = INF;
		for(int i = 1; i <= N; ++i)
			if(!selected[i] && d[i] < minim)
				minim = d[i], k = i;
		if(minim == INF)
			ok = false;
		else
		{
			selected[k] = 1;
			for(int i = 1; i <= N; ++i)
				if(!selected[i] && d[k] + c[k][i] < d[i])
					d[i] = d[k] + c[k][i], ant[i] = k;
		}
	}
}

void debug()
{
	for(int i = 1; i <= N; ++i)
	{
		for(int j = 1; j <= N; ++j)
			cout << c[i][j] << " ";
		cout << "\n";
	}
}

int main()
{
	read();
	dijkstra();
	
	for(int i = 2; i <= N; ++i)
		if(d[i] < INF)
			g << d[i] << " ";
		else
			g << 0 << " ";
	//debug();
}