Pagini recente » Cod sursa (job #1308300) | Cod sursa (job #1021938) | Cod sursa (job #1565584) | Cod sursa (job #901664) | Cod sursa (job #195340)
Cod sursa(job #195340)
#include<stdio.h>
#include<vector>
#define nmax 50024
const int mult=1<<29;
using namespace std;
vector< pair<int,int> > graf[nmax];
int dmin[nmax];
int h[nmax];
int poz[nmax];
int sf=1;
int N,M;
void change(const int a,const int b);
void down(const int stuff)
{
int left,right,ctrl=stuff;
left=ctrl<<1;
right=left+1;
if( left<= sf ){
if( dmin[ h[left] ]< dmin[ h[ctrl] ])
ctrl=left;
if( right<=sf )
if( dmin[h[right]]<dmin[h[ctrl]] )
ctrl=right;
}
if( ctrl!=stuff )
{
poz[ h[stuff] ]=ctrl;
poz[ h[ctrl] ]=stuff;
change(ctrl,stuff);
if( ctrl!=sf )
down(ctrl);
}
}
void upp(const int stuff)
{
int father,ctrl=stuff;
father=ctrl>>1;
if( father>= 1)
if( dmin[ h[ctrl] ]< dmin[h[father]] )
ctrl=father;
if( ctrl!=stuff )
{
poz[h[ctrl]]=stuff;
poz[h[stuff]]=ctrl;
change(ctrl,stuff);
if( ctrl!=1 )
upp(ctrl);
}
}
void change(const int a,const int b)
{
h[a]^=h[b];
h[b]^=h[a];
h[a]^=h[b];
}
void djikstra(){
int i;
for(i=2; i<=N; ++i)
dmin[i]=mult,poz[i]=-1;
dmin[1]=0;
h[1]=poz[1]=1;
int aux;
int sumt;
vector< pair<int,int> >::iterator it;
while( sf )
{
aux=h[1];
change(1,sf);
poz[h[1]]=1;
--sf;
down(1);
for(it=graf[aux].begin(); it!=graf[aux].end(); ++it)
{
sumt=it->second+dmin[aux];
if( dmin[it->first]> sumt )
{
dmin[ it->first ]=sumt;
if( poz[it->first]==-1 )
{
h[++sf]=it->first;
poz[it->first]=sf;
upp(sf);
}
else
upp(poz[it->first]);
}
}
}
}
int main()
{
freopen("dijkstra.in","r",stdin);
freopen("dijkstra.out","w",stdout);
scanf("%d%d",&N,&M);
int i,a1,a2,a3;
for(i=1; i<=M; ++i){
scanf("%d%d%d",&a1,&a2,&a3);
graf[a1].push_back(make_pair(a2,a3));
}
djikstra();
for(i=2; i<=N; ++i)
if( dmin[i]!=mult )
printf("%d ",dmin[i]);
else
printf("%d ",0);
printf("\n");
return 0;
}