Cod sursa(job #1959277)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 9 aprilie 2017 12:22:18
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 2.11 kb
#include <cstdio>
#include <utility>
#include <queue>
#include <vector>

using namespace std;

const int N = 50005;
const int inf = 1000000;
const int BUFFER_SIZE = 16384;

int n, m;

vector<pair<int, int> > vecini[N];
int distante[N];
priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > Q;

void citire()
{
   scanf("%d %d", &n, &m);
   
   int tmp1, tmp2, tmp3;

   for(int i = 0; i < m; i++)
   {
		scanf("%d %d %d", &tmp1, &tmp2, &tmp3);

		tmp1--;
		tmp2--;

		vecini[tmp1].push_back(make_pair(tmp3, tmp2));
   }

   for(int i = 0; i < n; i++)
   {
		distante[i] = inf;
   }
}

int isDigit(char x)
{
	if(x < '0')
	{
		return false;
	}

	if(x > '9')
	{
		return false;
	}

	return true;
}

char _buffer[BUFFER_SIZE];
int bufferPoz = BUFFER_SIZE - 1;

char readCh()
{
	bufferPoz++;
	
	if(bufferPoz == BUFFER_SIZE)	
	{
		bufferPoz = 0;
		fread(_buffer, 1, BUFFER_SIZE, stdin);
	}

	return _buffer[bufferPoz];
}

int readInt()
{
	int rez = 0;
	char x = 0;
	
	while(isDigit(x = readCh()) == false);

	while(isDigit(x) == true)
	{
		rez = rez * 10 + (x - '0');
		x = readCh();
	}

	return rez;
}

void citireParsare()
{
	n = readInt();
	m = readInt();
	
	int tmp1, tmp2, tmp3;

	for(int i = 0; i < m; i++)
	{
		tmp1 = readInt();
		tmp2 = readInt();
		tmp3 = readInt();

		 tmp1--;
		 tmp2--;

		 vecini[tmp1].push_back(make_pair(tmp3, tmp2));
	}

	for(int i = 0; i < n; i++)
	{
		 distante[i] = inf;
	}
}

void solve()
{
	Q.push(make_pair(0, 0));
	distante[0] = 0;

	while(Q.empty() == false)
	{
		int x = Q.top().second;
		Q.pop();

		int l = vecini[x].size();

		for(int i = 0; i < l; i++)
		{
			if(distante[vecini[x][i].second] > distante[x] + vecini[x][i].first)	
			{
				distante[vecini[x][i].second] = distante[x] + vecini[x][i].first;
				Q.push(make_pair(distante[vecini[x][i].second], vecini[x][i].second));
			}
		}
	}
}

void afisare()
{
	for(int i = 1; i < n; i++)
	{
		if(distante[i] == inf)
		{
			printf("0 ");
		}
		else
		{
			printf("%d ", distante[i]);
		}
	}
}

int main()
{
	freopen("dijkstra.in", "r", stdin);
	freopen("dijkstra.out", "w", stdout);

	citireParsare();
	solve();
	afisare();

	return 0;
}