Pagini recente » Borderou de evaluare (job #502065) | Borderou de evaluare (job #1459479) | Borderou de evaluare (job #2479531) | Borderou de evaluare (job #1837251) | Cod sursa (job #3335855)
// alg dijkstra
// pe ce e folosit? --> grafuri ORIENTATE care pot CONTINE CICLURI si au doar ponderi POZITIVE
// cum functioneaza??
// generalizare a algoritmului de bfs -> cand toate nodurile au distantele egale este chiar echivalent
// complexitate: O()
#include <iostream>
#include <fstream>
#include <bits/stdc++.h>
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
int d[50001]; // costul drumului de la sursa la i
int tata[50001]; // tatal lui i pentru distanta curent salvata
int INF = 1e9;
vector<pair<int, int>> lista[50001];
stack<int> Q; // multimea vf neselectate
int main()
{
int n, m;
fin >> n >> m;
for (int i = 1; i <= m; i++)
{
int x, y, c;
fin >> x >> y >> c;
// pt graf orientat
lista[x].push_back({y, c});
}
// init
for (int i = 1; i <= n; i++)
{
d[i] = INF;
tata[i] = 0;
}
d[1] = 0; // start in 1
Q.push(1);
while (!Q.empty())
{
int nodTop = Q.top(); // u
Q.pop();
for (auto vecin : lista[nodTop]) // nodTop parintele vecinuluo
{
int nodVecin = vecin.first; // nod v
int costVecin = vecin.second; // w(u, v) costul arcului (u,v)
// "relaxarea" muchiei :)
if (d[nodVecin] > d[nodTop] + costVecin)
{
d[nodVecin] = d[nodTop] + costVecin;
tata[nodVecin] = nodTop;
}
Q.push(nodVecin);
}
}
for (int i = 2; i <= n; i++)
fout << d[i] << " ";
return 0;
}