Pagini recente » Cod sursa (job #2605539) | Cod sursa (job #1071273) | Cod sursa (job #2580624) | Cod sursa (job #145384) | Cod sursa (job #2855593)
#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;
}