Pagini recente » Cod sursa (job #1297157) | Cod sursa (job #650119) | Cod sursa (job #825032) | Cod sursa (job #171731) | Cod sursa (job #2424048)
#include <iostream>
#include <climits>
#include <fstream>
#include <list>
#include <vector>
#include <set>
using namespace std;
#define inf INT_MAX/2
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
void citire(list <pair <int,int> > * &L,int &n,int &m)
{
fin>>n>>m;
L=new list<pair<int,int> >[n+1];
int x,y,p;
for(int i=0;i<m;i++)
{
fin>>x>>y>>p;
L[x].push_back({p,y});
L[y].push_back({p,x});
}
}
void initializare(vector <int> &t,vector <int> &d, int n,int st)
{
t.resize(n+1);
d.resize(n+1);
for(int i=1;i<=n;i++)
{
t[i]=0;
d[i]=inf;
}
d[st]=0;
}
void Dijkstra(list <pair <int,int> > *L,int n,int m,int st,vector <int> &t,vector <int> &d)
{
set <pair <int,int> > Q;
initializare(t,d,n,st);
for(int i=1;i<=n;i++)
Q.insert({d[i],i});
vector <int > s(n+1,0);
int nrsel=0;
while(nrsel!=n)
{
int x;
do
{
x=Q.begin()->second;
Q.erase(Q.begin());
}
while(s[x]==1);
s[x]++;
nrsel++;
for(auto pr: L[x])
if(!s[pr.second])
{
int y=pr.second;
int p=pr.first;
if(d[y]>d[x]+p)
{
d[y]=d[x]+p;
t[y]=x;
Q.insert({d[y],y});
}
}
}
for(int i=2;i<=n;i++)
{
fout<<d[i]<<' ';
}
fout<<'\n';
}
int main()
{
list <pair <int,int> > *L;
int n,m,st;
vector <int> t;
vector <int> d;
citire(L,n,m);
Dijkstra(L,n,m,1,t,d);
return 0;
}