Pagini recente » Cod sursa (job #1386674) | Cod sursa (job #1853245) | Cod sursa (job #2382318) | Cod sursa (job #2135345) | Cod sursa (job #3275260)
#include <bits/stdc++.h>
using namespace std;
const int N_MAX = 5e4 + 5, M_MAX = 25e4 + 5, INF = 1 << 28;
int N, M;
int dist[N_MAX];
bitset<N_MAX> inQueue;
struct Edge
{
int v, c;
Edge(int _v, int _c) :
v(_v), c(_c) {}
Edge() {}
};
struct PQCmp
{
inline bool operator()(const int& a, const int& b)
{
return dist[a] > dist[b];
}
};
vector<Edge> G[N_MAX];
void SetInput(string name)
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
(void)!freopen((name + ".in").c_str(), "r", stdin);
(void)!freopen((name + ".out").c_str(), "w", stdout);
}
void ReadInput()
{
cin >> N >> M;
for(int i = 0, v1, v2, c; i < M; i++)
{
cin >> v1 >> v2 >> c;
G[v1].emplace_back(v2, c);
}
}
void Dijkstra(int start)
{
priority_queue<int, vector<int>, PQCmp> PQ;
for(int i = 1; i <= N; i++)
dist[i] = INF;
PQ.push(start);
dist[start] = 0;
inQueue[start] = 1;
int V;
while(not PQ.empty())
{
V = PQ.top();
PQ.pop();
inQueue[V] = 0;
for(Edge fiu : G[V])
if(dist[fiu.v] > dist[V] + fiu.c)
{
dist[fiu.v] = dist[V] + fiu.c;
if(not inQueue[fiu.v])
{
PQ.push(fiu.v);
inQueue[fiu.v] = 1;
}
}
}
for(int i = 2; i <= N; i++)
{
if(dist[i] == INF) dist[i] = 0;
cout << dist[i] << ' ';
}
}
int main()
{
SetInput("dijkstra");
ReadInput();
Dijkstra(1);
return 0;
}