Cod sursa(job #2487746)

Utilizator Alex_AmarandeiAmarandei Matei Alexandru Alex_Amarandei Data 5 noiembrie 2019 18:23:24
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>
#define INF 99999
#define NMAX 1005
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");

void read();
void Dijkstra();
void write();
void path(int x);

struct varf
{
	int x, c;
} a[NMAX][NMAX];

int n, m, dmin[NMAX], pre[NMAX][NMAX], gr[NMAX], drum[NMAX], start, vfmin;
bool f[NMAX];

int main()
{
	read();
	Dijkstra();
	write();

	return 0;
}

void read()
{
	int i, x = 0;

	fin >> n >> start;

	while (fin >> x)
	{
		gr[x]++;
		fin >> a[x][gr[x]].x >> a[x][gr[x]].c;
	}

	f[start] = true;

	for (i = 1; i <= n; i++)
	{
		dmin[i] = INF;
		pre[i][0] = 0;  pre[i][1] = start;
	}

	pre[start][0] = pre[start][1] = 0; dmin[start] = 0;

	for (i = 1; i <= gr[start]; i++)
		dmin[a[start][i].x] = a[start][i].c;
}

void Dijkstra()
{
	int x, i, j, vfmin = 0, cmin;

	for (j = 0; j < n - 1; j++)
	{
		// aflu vfmin
		cmin = INF + 1;
		for (x = 1; x <= n; x++)
			if (!f[x] && dmin[x] < cmin)
			{
				cmin = dmin[x];
				vfmin = x;
			}

		if (cmin == INF)
			break;

		f[vfmin] = true;

		for (i = 1; i <= gr[vfmin]; i++)
			if (!f[a[vfmin][i].x])
			{
				if (dmin[a[vfmin][i].x] > dmin[vfmin] + a[vfmin][i].c)
				{
					dmin[a[vfmin][i].x] = dmin[vfmin] + a[vfmin][i].c;
					pre[a[vfmin][i].x][1] = vfmin; pre[a[vfmin][i].x][0] = 1;
				}
				else
					if (dmin[a[vfmin][i].x] == dmin[vfmin] + a[vfmin][i].c)
						pre[a[vfmin][i].x][++pre[a[vfmin][i].x][0]] = vfmin;
			}
	}
}

void write()
{
	int i, j, k, lg;

	for (i = 1; i <= n; i++)
		if (dmin[i] == INF)
			fout << 0 << ' ';
		else
		{
			fout << dmin[i] << ' ';
		}
}