Pagini recente » Cod sursa (job #1610287) | Cod sursa (job #272020) | Cod sursa (job #974361) | Cod sursa (job #1246907) | Cod sursa (job #1535032)
#include<fstream>
#include<vector>
#include<climits>
#define N 50002
#define inf INT_MAX
using namespace std;
ifstream cin("dijkstra.in");
ofstream cout("dijkstra.out");
vector <pair <int,int> > G[N];
int m,n,a,b,c,i,drum[N],dim=1,H[N],poz[N],nod,j,x;
void up(int nod)
{
while(nod/2!=0 and drum[H[nod/2]]>drum[H[nod]])
{
swap(H[nod/2],H[nod]);
swap(poz[H[nod/2]],poz[H[nod]]);
nod/=2;
}
}
void down()
{
int nod=1;
while(2*nod<dim)
{
int aux=2*nod;
if(aux+1<dim and drum[H[aux+1]]<drum[H[aux]])
aux++;
if(drum[H[aux]]<drum[H[nod]])
{
swap(H[aux],H[nod]);
swap(poz[H[aux]],poz[H[nod]]);
nod=aux;
}
else
break;
}
}
int main()
{
cin>>n>>m;
for(i=1;i<=m;i++)
{
cin>>a>>b>>c;
G[a].push_back(make_pair(b,c));
}
for(i=2;i<=n;i++)
drum[i]=inf;
H[1]=1;
poz[1]=1;
for(i=1;i<=n;i++)
{
nod=H[1];
H[1]=H[dim];
poz[H[1]]=1;
dim--;
down();
for(j=0;j<(int)G[nod].size();j++)
{
x=G[nod][j].first;
c=G[nod][j].second;
if(drum[x]>drum[nod]+c)
{
drum[x]=drum[nod]+c;
if(!poz[x])
{
H[++dim]=x;
poz[x]=dim;
up(dim);
}
else
up(poz[x]);
}
}
}
for(i=2;i<=n;i++)
if(drum[i]!=inf)
cout<<drum[i]<<" ";
else
cout<<0<<" ";
return 0;
}