Pagini recente » Cod sursa (job #3284448) | Statistici Dumitru Florentin Giuliano (FLORENTIN-GIULIANO.DUMITRU) | Arhiva de probleme | Cod sursa (job #2912707) | Cod sursa (job #1886979)
#include <fstream>
#include <vector>
#define Ndim 50001
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
int V[Ndim],P[Ndim],H[Ndim],hdim;
vector < pair <int,int> > G[Ndim];
void up(int nod)
{
int tata = nod/2;
while(nod!=1 && V[H[nod]] < V[H[tata]])
{
swap(H[nod],H[tata]);
swap(P[H[nod]],P[H[tata]]);
nod/=2;
tata/=2;
}
}
void down(int nod)
{
int fiu = 2*nod;
while(fiu <= hdim)
{
if(fiu+1<=hdim && V[H[fiu]]>V[H[fiu+1]])
fiu++;
if(V[H[nod]] > V[H[fiu]])
{
swap(H[nod],H[fiu]);
swap(P[H[nod]],P[H[fiu]]);
nod = fiu;
fiu = 2*nod;
}
else
break;
}
}
void heap_insert(int poz)
{
H[++hdim] = poz;
P[poz] = hdim;
up(hdim);
}
int heap_extract()
{
int nod = H[1];
H[1] = H[hdim];
P[H[1]] = 1;
--hdim;
down(1);
return nod;
}
int main()
{
int n,m,i,fiu,c,nod,a,b,j;
fin>>n>>m;
for(i=1;i<=m;i++)
{
fin>>a>>b>>c;
G[a].push_back(make_pair(b,c));
G[b].push_back(make_pair(a,c));
}
for(i=2;i<=n;i++)
V[i] = -1;
heap_insert(1);
for(i=1;i<=n;i++)
{
nod = heap_extract();
for(j=0;j<G[nod].size();j++)
{
fiu = G[nod][j].first;
c = G[nod][j].second;
if(V[fiu]>V[nod]+c || V[fiu]==-1)
{
V[fiu] = V[nod]+c;
if(P[fiu] == 0)
heap_insert(fiu);
else
up(P[fiu]);
}
}
}
for(i=2;i<=n;i++)
if(V[i]!=-1)
fout<<V[i]<<' ';
else
fout<<0<<' ';
return 0;
}