Pagini recente » Cod sursa (job #2478632) | Cod sursa (job #453529) | Cod sursa (job #769431) | Cod sursa (job #1044727) | Cod sursa (job #2569219)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fi("dijkstra.in");
ofstream fo("dijkstra.out");
struct varf
{
int id, dist;
};
struct heap
{
int n;
varf elems[50001];
};
heap creeaza_heap()
{
heap h;
h.n=0;
return h;
}
bool conditie_copil(heap h, int poz)
{
if(h.elems[(poz-1)/2].dist > h.elems[poz].dist)
return false;
return true;
}
bool conditie_parinte(heap h, int poz)
{
if(h.elems[poz].dist > h.elems[2*poz+1].dist ||
h.elems[poz].dist > h.elems[2*poz+2].dist)
return false;
return true;
}
void heapify_up(heap& h, int poz)
{
while(poz>0 && (!conditie_copil(h,poz)))
{
swap(h.elems[poz], h.elems[(poz-1)/2]);
poz=(poz-1)/2;
}
}
void adauga(heap& h, varf vf)
{
h.elems[h.n]=vf;
h.n++;
heapify_up(h, h.n -1);
}
varf sterge(heap& h)
{
varf rez=h.elems[0];
h.n--;
h.elems[0]=h.elems[h.n];
int poz=0;
while(poz<(h.n/2) && !conditie_parinte(h,poz))
{
if(h.elems[poz].dist > h.elems[2*poz+1].dist ||
h.elems[poz].dist > h.elems[2*poz+2].dist)
{
if(h.elems[2*poz+1].dist > h.elems[2*poz+2].dist)
{
swap(h.elems[poz],h.elems[2*poz+2]);
poz=2*poz+2;
}
else
{
swap(h.elems[poz],h.elems[2*poz+1]);
poz=2*poz+1;
}
}
}
return rez;
}
int n, m;
vector<varf> v[50001];
int rez[50001];
int mst[50001];
int main()
{
fi>>n>>m;
int a,b,c;
varf vf;
for(int i=1; i<=m; i++)
{
fi>>a>>b>>c;
vf.id=b;
vf.dist=c;
v[a].push_back(vf);
/*vf.id=a;
v[b].push_back(vf);*/
}
heap h= creeaza_heap();
varf r;
r.id=1;
r.dist=0;
adauga(h,r);
mst[1]=1;
int nrv=1;
while(nrv<n)
{
vector<varf> ::iterator it;
for(it=v[h.elems[0].id].begin(); it!=v[h.elems[0].id].end(); it++)
{
if(mst[(*it).id]==0)
{
vf.id=(*it).id;
vf.dist=(*it).dist+h.elems[0].dist;
adauga(h,vf);
}
}
while(mst[h.elems[0].id]==1)
{
sterge(h);
}
rez[h.elems[0].id]=h.elems[0].dist;
mst[h.elems[0].id]=1;
nrv++;
}
for(int i=2;i<=n;i++)
fo<<rez[i]<<" ";
fi.close();
fo.close();
return 0;
}