Pagini recente » Cod sursa (job #1495522) | Cod sursa (job #1806682) | Cod sursa (job #1766399) | Cod sursa (job #197432) | Cod sursa (job #2373511)
#include <iostream>
#include <fstream>
#include <limits.h>
#include <set>
#include <vector>
#define INF INT_MAX
#define MAXN 50001
using namespace std;
int N, M;
bool vis[MAXN];
int dist[MAXN];
vector<pair<int,int>> G[MAXN];//adjacency list with vertex-weight pairs
//G[a][0].first contains the number of neighbours of a
set<pair<int,int>> S; //a set of distance-node pairs
void Read()
{
ifstream f("dijkstra.in");
f>>N>>M;
for (int i=1;i<=N;i++)
{
//G[i].push_back({0, 0});
dist[i]=(i==1)?0:INF;
//S.insert({dist[i], i});
}
int a, b, c;
for (int i=1;i<=M;i++)
{
f>>a>>b>>c;
G[a].push_back({b, c});
//G[a][0].first++;
}
}
void Dijkstra()
{
int source, sourcedist, nextnode, nextdist;
S.insert({0,1});
while (!S.empty())
{
source=S.begin()->second;
sourcedist=S.begin()->first;
//cout<<"At "<<source<<'\n';
S.erase(S.begin());
for (vector<pair<int,int>>::iterator it=G[source].begin();it!=G[source].end();++it)
{
nextnode=it->first;
nextdist=it->second;
if (vis[nextnode])
continue;
if (dist[nextnode]>nextdist+sourcedist)
{
if (dist[nextnode]!=INF)
S.erase(S.find({dist[nextnode], nextnode}));
dist[nextnode]=nextdist+sourcedist;
S.insert({dist[nextnode], nextnode});
}
}
vis[source]=1;
}
}
void Write()
{
ofstream g("dijkstra.out");
for (int i=2;i<=N;i++)
if (dist[i]==INF)
g<<0<<' ';
else
g<<dist[i]<<' ';
}
int main()
{
Read();
Dijkstra();
Write();
}