Pagini recente » Cod sursa (job #3197260) | Cod sursa (job #1799606) | Cod sursa (job #1107656) | Cod sursa (job #410216) | Cod sursa (job #3300512)
#include <bits/stdc++.h>
#define NMAX 30005
#define MMAX 100025
using namespace std;
vector<vector<pair<int, int>>> liste_adiacenta; ///pentru fiecare nod salvam toate nodurile cu care este conectat (primul numar din pereche reprezinta nodul si al doilea reprezinta distanta)
int main()
{
ifstream cin("sate.in");
ofstream cout("sate.out");
int n, m, x, y;
cin >> n >> m >> x >> y;
liste_adiacenta.resize(n+1);
///vom transforma relatiile dintre sate intr-un graf, unde nodurile reprezinta satele si muchiile reprezinta relatiile
for(int i=1; i<=m; i++) ///citim muchiile
{
int nod1, nod2, distanta;
cin >> nod1 >> nod2 >> distanta; ///citim satele si distanta dintre ele
liste_adiacenta[nod1].push_back({nod2, distanta}); ///salvam nodul si distanta
liste_adiacenta[nod2].push_back({nod1, -distanta}); ///daca nodul adaugat in lista este mai mic ca nodul specific listei, salvam distanta cu minus
}
///vom face o parcurgere bfs a grafului creat incepand de la nodul x
queue<int> q;
vector<int> distante(n+1, -1); ///distanta de la nodul x la celelalte noduri
q.push(x);
distante[x]=0;
while(!q.empty())
{
int nod=q.front();
q.pop();
for(auto vecin : liste_adiacenta[nod]) ///parcurgem toate nodurile care au o muchie comuna cu nodul din coada
{
if(distante[vecin.first]==-1) ///daca nu am parcurs pana acum acel nod
{
distante[vecin.first]=distante[nod]+vecin.second; ///calculam distanta pana la acel nod (sat)
q.push(vecin.first); ///il adaugam la coada
}
}
}
cout << distante[y]; ///afisam distanta de la x la y
return 0;
}