Pagini recente » Cod sursa (job #234213) | Cod sursa (job #34108) | Cod sursa (job #1154723) | Cod sursa (job #2905820) | Cod sursa (job #1981993)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
const int nMax = 50005;
const int mMax = 250005;
const int INF = (1 << 30);
struct arc
{
arc(int tind = 0, int tcost = 0)
{
ind = tind;
cost = tcost;
}
int ind, cost;
};
int n, m;
vector<arc> vecini[nMax];
int dp[nMax];
bool viz[nMax];
void citire()
{
ifstream in("dijkstra.in");
in >> n >> m;
int a, b, c;
for(int i = 1; i <= m; ++i)
{
in >> a >> b >> c;
vecini[a].push_back(arc(b, c));
}
in.close();
}
struct cmp
{
bool operator()(const pair<int, int> &a, const pair<int, int> &b)
{
return a.first > b.first;
}
};
void rezolvare()
{
const int start = 1; //nodul de la care plecam
for(int i = 1; i <= n; ++i)
dp[i] = INF;
priority_queue<pair<int, int>, vector<pair<int, int> >, cmp> q;
dp[start] = 0;
q.push(make_pair(0, start));
pair<int, int> p;
int current, cost;
while(q.empty() == false)
{
p = q.top();
q.pop();
current = p.second;
cost = p.first;
for(auto &v:vecini[current])
{
if(viz[v.ind])
continue;
if(dp[v.ind] > cost + v.cost)
{
dp[v.ind] = cost + v.cost;
q.push(make_pair(dp[v.ind], v.ind));
viz[v.ind] = true;
}
}
}
}
void afisare()
{
ofstream out("dijkstra.out");
for(int i = 2; i <= n; ++i)
{
if(dp[i] == INF)
out << 0 << " ";
else
out << dp[i] << " ";
}
out.close();
}
int main()
{
citire();
rezolvare();
afisare();
return 0;
}