Cod sursa(job #2967636)

Utilizator TudosieRazvanTudosie Marius-Razvan TudosieRazvan Data 19 ianuarie 2023 21:37:20
Problema Algoritmul Bellman-Ford Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#include <climits>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <bitset>
#include <map>
#include <cstring>
#include <algorithm>

#define NMAX 303 


using namespace std;



ifstream fin("bellmanford.in");
ofstream fout("bellmanford.out");

int n, m;
int ciclu[NMAX];
int dMax[NMAX];
bool viz[NMAX];
vector<pair<int, int>>graf[NMAX];



int main()
{
	fin >> n >> m;
	for (int i = 1; i <= m; i++)
	{
		int x, y, cost;
		fin >> x >> y >> cost;
		graf[x].push_back({ y,cost });
	}


	for (int i = 1; i <= n; i++)
	{
		dMax[i] = INT_MAX;
	}

	queue<int>coada;
	coada.push(1);
	dMax[1] = 0;
	viz[1] = true;
	ciclu[1] = 1;

	while (!coada.empty())
	{
		int prec = coada.front();
		coada.pop();
		viz[prec] = false;

		for (auto itr = graf[prec].begin(); itr != graf[prec].end(); itr++)
		{
			int nd = itr->first;
			int cMuchie = itr->second;
			if (dMax[nd] > dMax[prec] + cMuchie)
			{
				dMax[nd] = dMax[prec] + cMuchie;
				ciclu[nd]++;
				if (ciclu[nd] > n)
				{
					fout << "Ciclu negativ!";
					return 0;
				}
				if (!viz[nd])
				{
					coada.push(nd);
					viz[nd] = true;
				}
			}
		}
	}

	for (int i = 2; i <= n; i++)
	{
		fout << dMax[i]<<" ";
	}
	return 0;
}