Pagini recente » Cod sursa (job #1009182) | Cod sursa (job #2711919) | Cod sursa (job #414799) | Cod sursa (job #1424922) | Cod sursa (job #718857)
Cod sursa(job #718857)
#include<stdio.h>
#include<vector>
#define max 2000000000
using namespace std;
FILE*f=fopen("dijkstra.in","r");
FILE*g=fopen("dijkstra.out","w");
int a,b,c,nr,n,m,d[200001],p[200001],t[200001],sol[50001];
char viz[50001];
vector <pair<int,int> > v[250001];
void up(int x)
{
int k=d[x];
int pk=p[x];
while(x>1&&k<d[x/2])
{
d[x]=d[x/2];
p[x]=p[x/2];
t[p[x]]=x;
x/=2;
}
d[x]=k;
p[x]=pk;
t[p[x]]=x;
}
void down(int x)
{
int k=d[x];
int pk=p[x];
int ok=1;
while(ok&&x<=nr)
{
int son=0;
if(2*x<=nr)
son=2*x;
if(2*x+1<=nr&&d[2*x+1]<d[2*x])
son=2*x+1;
if(d[son]>=k||!son)
ok=0;
else
{
d[x]=d[son];
p[x]=p[son];
t[p[x]]=x;
x=son;
}
}
d[x]=k;
p[x]=pk;
t[p[x]]=x;
}
void dijkstra()
{
int k;
int min=max;
if(nr)
{
min=d[1];
sol[p[1]]=d[1];
k=p[1];
d[1]=d[nr];
p[1]=p[nr];
--nr;
down(1);
}
if(min!=max)
{
viz[k]=1;
for(int i=0;i<v[k].size();++i)
if(!viz[v[k][i].first])
if(d[t[v[k][i].first]]>min+v[k][i].second)
{
d[t[v[k][i].first]]=min+v[k][i].second;
up(t[v[k][i].first]);
}
dijkstra();
}
}
int main()
{
fscanf(f,"%d%d",&n,&m);
for(int i=1;i<=m;++i)
{
fscanf(f,"%d%d%d",&a,&b,&c);
v[a].push_back (make_pair(b,c));
}
for(int i=2;i<=n;++i)
d[i]=max;
for(int i=1;i<=n;++i)
{
p[i]=t[i]=i;
}
nr=n;
dijkstra();
for(int i=2;i<=n;++i)
if(sol[i]!=max)
fprintf(g,"%d ",sol[i]);
else
fprintf(g,"0 ");
fclose(g);
fclose(f);
return 0;
}