Pagini recente » Cod sursa (job #1732083) | Cod sursa (job #963755) | Cod sursa (job #507931) | Cod sursa (job #1290534) | Cod sursa (job #1109531)
#include<fstream>
#include<cstring>
#define fi first
#define se second
#include<vector>
#define N 50100
#define inf (1<<30)
using namespace std;
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");
vector<pair<int,int> >v[N];
int n,m,i,x,y,c,H[4*N],K[N],in,nod,p,D[N];
void up(int st,int dr,int po)
{
if(st==dr)
{
H[po]=p;
return;
}
int mij=(st+dr)>>1;
if(p<=mij)
up(st,mij,po<<1);
else
up(mij+1,dr,(po<<1)+1);
if(D[H[po<<1]]<D[H[(po<<1)+1]]&&!K[H[po<<1]])
H[po]=H[po<<1];
else
H[po]=H[(po<<1)+1];
}
int main ()
{
f>>n>>m;
for(i=1;i<=m;++i)
{
f>>x>>y>>c;
v[x].push_back(make_pair(y,c));
v[y].push_back(make_pair(x,c));
}
for(i=0;i<=n;++i)
D[i]=inf;
p=1;x=0;in=1;
D[1]=0;
up(1,n,1);
while(in)
{
in--;
nod=H[1];
K[nod]=1;
x=inf;
p=nod;
up(1,n,1);
for(int i=0;i<v[nod].size();++i)
{
if(D[nod]+v[nod][i].se<D[v[nod][i].fi])
{
if(D[v[nod][i].fi]==inf)
in++;
D[v[nod][i].fi]=D[nod]+v[nod][i].se;
x=D[v[nod][i].fi];
p=v[nod][i].fi;
up(1,n,1);
}
}
}
for(i=2;i<=n;++i)
{
if(D[i]>=inf)
D[i]=0;
g<<D[i]<<" ";
}
return 0;
}