Cod sursa(job #2855593)

Utilizator IanisOpritescuOpritescu Ianis IanisOpritescu Data 22 februarie 2022 17:26:56
Problema Sate Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

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

struct graf {
	int nod, cost;
};//structura in care marcam nodul final si distanta pana la acesta

int n, m, X, Y;
vector <graf> G[30005];
bool viz[30005];
int dist[30005]; ///d[i] - distanta de la nodul 1 la nodul i

void bfs(int x)
{
	//un bfs putin modificat
	queue <int> que;
	
	dist[x] = 0; //din nodul de inceput ii marchez distanta pana la el ca fiind 0(necunoscuta inca)
	viz[x] = 1; // marcam ca si vizitat
	que.push(x); //il adaug in coada(pentru a i fi studiati vecinii)

	while (!que.empty())//cat timp nu mai am vecini de verificat...
	{
		int vf = que.front();///scot primul nod din coada...

		for (auto it : G[vf])//parcurg toti vecinii acestuia..
		{
			if (viz[it.nod] == 0)//daca nu au fost anterior vizitati...
			{
				viz[it.nod] = 1;//ii marchez ca si vizitati
				que.push(it.nod);//ii adaug in coada pentru a fi studiati
				dist[it.nod] = dist[vf] + it.cost;///distanta pana la satul actual la care pot ajunge(ii cunosc distanta)(it.nod) va fi egala cu distanta de la satul de la care vin +- distanta( de referinta fata de satul 1) de la satul de la care am plecat
			}
		}

		que.pop();
	}
}

int main()
{
	fin >> n >> m >> X >> Y;
	for (int i = 1; i <= m; i++)
	{
		int x, y, c;
		fin >> x >> y >> c; //citim nod initial, nod final si "costul"(distanta) de la un sat la altul
		G[x].push_back({ y, c });
		G[y].push_back({ x, -c });
	}

	bfs(X);//algoritm bfs din primul sat cerut

	fout << dist[Y];///afisez distanta pana la nodul Y

	return 0;
}