Pagini recente » Cod sursa (job #1117975) | Cod sursa (job #386855) | Cod sursa (job #2259983) | Cod sursa (job #3175562) | Cod sursa (job #1582734)
#include <fstream>
#include <vector>
#include <algorithm>
#include <climits>
#include <queue>
#define endl '\n'
#define Nmax 50010
#define inf INT_MAX
#define MP make_pair
#define ii pair<int,int>
#define vii vector < ii >
using namespace std;
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");
vector < pair<int,int> > M[Nmax];
priority_queue < ii, vii, greater<ii> > heap;
int n,m,x,y,z,D[Nmax],viz[Nmax];
void dijkstra(int nod,int n)
{for(int i=1;i<=n;i++)
{viz[i]=0;
D[i]=inf;//resetare
}
ii top;
int poz,d; //poz=indice pentru top, d=distanta pentru top
heap.push(MP(nod,0));
while(heap.empty()==0)
{top=heap.top();
heap.pop();
poz=top.first;
d=top.second;
if(viz[poz])
continue;
viz[poz]=1;
for(int i=0;i<M[poz].size();i++) //parcurg nodurile adiacente cu top
if(viz[M[poz][i].first]==0&&M[poz][i].second+d<D[M[poz][i].first]) //daca top nu e vizitat
//si daca distanta de la nodul curent la top e mai mica decat cea initiala, modific distanta si o pun in heap
heap.push(MP(M[poz][i].first,(D[M[poz][i].first]=M[poz][i].second+d)));
}
}
int main()
{f>>n>>m;
for(int i=1;i<=m;i++)
{f>>x>>y>>z;
M[x].push_back(MP(y,z));
M[y].push_back(MP(x,z));
}
dijkstra(1,n);
for(int i=2;i<=n;i++)
D[i]!=inf? g<<D[i]<<endl : g<<0<<endl;
return 0;
}