Pagini recente » Cod sursa (job #2294006) | Cod sursa (job #2284842) | Cod sursa (job #2126698) | Cod sursa (job #1520973) | Cod sursa (job #503895)
Cod sursa(job #503895)
using namespace std;
#include<iostream>
#include<fstream>
#include<vector>
#include<string>
#define pb push_back
#define oo 0x3f3f3f3f
#define common int m=(l+r)>>1, L=n<<1, R=L|1
#define nmax 50005
#define Nmax 150005
struct leg{
int n,c;
};
vector<leg> G[nmax];
ofstream fout("dijkstra.out");
int N,M,nh;
int d[50005];
int H[Nmax];
int poz[Nmax];
void update(int n,int ql,int l,int r, int v )
{
if(ql<=l && r<=ql)
{
H[n]=v;
poz[n]=l;
return;
}
common;
if(ql<=m)
update(L,ql,l,m,v);
if(ql>=m+1)
update(R,ql,m+1,r,v);
if(H[L]<H[R])
H[n]=H[L], poz[n]=poz[L];
else
H[n]=H[R], poz[n]=poz[R];
}
void solve()
{int u,i;
vector<leg>::iterator it;
nh=N;
memset(d, oo, sizeof(d));
d[1]=0;
for(i=1;i<=N;i++) update(1,i,1,N,d[i]);
while(nh)
{
nh--;
u=poz[1];
update(1,poz[1],1,N,oo);
for(it=G[u].begin();it!=G[u].end();it++)
{
if(d[it->n]>d[u]+it->c)
{
d[it->n]=d[u]+it->c;
update(1,it->n,1,N,d[it->n]);
}
}
}
for(i=2;i<=N;i++)
{
if(d[i]==oo) d[i]=0;
fout<<d[i]<<" ";
}
}
void cit()
{int i, x,y,c;
ifstream fin("dijkstra.in");
fin>>N>>M;
for(i=2;i<=N;i++)
d[i]=oo;
d[1]=0;
for(i=1;i<=M;i++)
{
fin>>x>>y>>c;
G[x].pb((leg){y,c});
}
fin.close();
}
int main()
{
cit();
solve();
fout.close();
return 0;
}