Pagini recente » Cod sursa (job #168763) | Cod sursa (job #1324420) | Cod sursa (job #2625808) | Cod sursa (job #3221465) | Cod sursa (job #1546565)
#include<fstream>
#include<vector>
#define inf 1000000
#define DIM 250010
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
int n,m,c,g,x,y,poz[DIM],drum[DIM],dim,nod,H[DIM],i,j;
vector <pair <int,int> > G[DIM];
void up(int nod)
{
while(nod/2>0 and drum[H[nod/2]]>drum[H[nod]])
{
swap(H[nod],H[nod/2]);
swap(poz[H[nod]],poz[H[nod/2]]);
nod/=2;
}
}
void down()
{
int nod=1;
while(nod*2<=dim)
{
int aux=nod*2;
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;
}
}
void dijkstra()
{
H[++dim]=1;
poz[1]=1;
drum[1]=0;
for(i=2;i<=n;i++)
drum[i]=inf;
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]);
}
}
}
}
int main()
{
fin>>n>>m;
for(i=1;i<=m;i++)
{
fin>>x>>y>>c;
G[x].push_back(make_pair(y,c));
}
dijkstra();
for(i=2;i<=n;i++){
if(drum[i]==inf){
fout<<0<<" ";
}
else{
fout<<drum[i]<<" ";
}
}
return 0;
}