Pagini recente » Cod sursa (job #1764946) | Cod sursa (job #252302) | Cod sursa (job #2831240) | Cod sursa (job #559633) | Cod sursa (job #2846166)
///grafuri orientate si ponderate
///determina distanta minima de la un nod selectat la toate celelalte noduri
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#define INF 2000000000
using namespace std;
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");
int dist[50005];
struct Queue{
bool operator()(int x, int y)
{
return dist[x] > dist[y];
}
};
priority_queue < int , vector < int > , Queue > Q;
vector < pair < int , int > > V[50005];
int n , m , a , b , c;
bool inqueue[50005];
void dijkstra(int x){
dist[x] = 0;
inqueue[x] = true;
Q.push(x);
while(!Q.empty()){
int now = Q.top();
Q.pop();
inqueue[x] = false;
for(int i = 0 ; i < V[now].size() ; ++i){
int N = V[now][i].first;
int c = V[now][i].second;
if(dist[now] + c < dist[N]){
dist[N] = dist[now] + c;
if(inqueue[N] == false){
inqueue[N] = true;
Q.push(N);
}
}
}
}
}
int main()
{
f >> n >> m;
for(int i = 1 ; i <= n ; ++i)
dist[i] = INF;
for(int i = 1 ; i <= m ; ++i){
f >> a >> b >> c;
V[a].push_back(make_pair(b , c));
}
dijkstra(1);
for(int i = 2 ; i <= n ; ++i){
if(dist[i] != INF)
g << dist[i] << " ";
else
g << 0 << " ";
}
return 0;
}