Pagini recente » Profil Stefan_Ionescu | Cod sursa (job #721630) | Cod sursa (job #707764) | Istoria paginii utilizator/rusupintilie | Cod sursa (job #1236620)
#include <fstream>
#include <vector>
#include <set>
#include <cstring>
#define oo 0x3f3f3f3f
#define Max_Size 50009
using namespace std;
const char iname[] = "dijkstra.in";
const char oname[] = "dijkstra.out";
int N, M;
vector < pair < int , int > > V[Max_Size];
vector < int > Distance;
set < pair < int , int > > my_Q;
inline void Dijkstra()
{
my_Q.insert( make_pair(0, 1) );
while(!my_Q.empty()) {
pair < int , int > nod = *my_Q.begin();
my_Q.erase(*my_Q.begin());
for(vector < pair< int, int> > :: iterator val = V[nod.second].begin(); val != V[nod.second].end(); ++val)
if(Distance[(*val).first] > nod.first + (*val).second) {
my_Q.erase( make_pair(Distance[(*val).first], (*val).first) );
Distance[(*val).first] = nod.first + (*val).second;
my_Q.insert( make_pair(Distance[(*val).first], (*val).first) );
}
}
}
int main()
{
ifstream f(iname); ofstream g(oname);
f >> N >> M;
Distance.resize(N + 1, oo);
for(int i = 1, x, y, cost; i <= M; ++i) {
f >> x >> y >> cost;
V[x].push_back(make_pair(y, cost));
}
Distance[1] = 0;
Dijkstra();
for(int i = 2; i <= N; ++i) g << ( Distance[i] != oo ? Distance[i] : 0) << ' ';
g << '\n';
g.close();
return 0;
}