Pagini recente » Cod sursa (job #41412) | Cod sursa (job #1421593) | Cod sursa (job #1957319) | Cod sursa (job #1646080) | Cod sursa (job #518264)
Cod sursa(job #518264)
#include <fstream>
#include <vector>
#define s 1
using namespace std;
vector<int>w[50003];
vector<int>v[50003];
int d[50001],poz[50001],heap[50001],h,n,m,u,S[50001];
void coboara(int i)
{
int minim;
minim=i;
if(i*2<=h and d[heap[i]]>d[heap[i*2]]) minim=i*2;
if(i*2+1<=h and d[heap[minim]]>d[heap[i*2+1]]) minim=i*2+1;
if(minim!=i)
{
swap(poz[heap[i]],poz[heap[minim]]);
swap(heap[i],heap[minim]);
coboara(minim);
}
}
void urca(int i)
{
int key=heap[i];
while(i>1 and d[key]<d[heap[i/2]])
{
heap[i]=heap[i/2];
poz[heap[i/2]]=i;
i=i/2;
}
heap[i]=key;
poz[key]=i;
}
int extract()
{
swap(heap[1],heap[h]);
swap(poz[heap[1]],poz[heap[h]]);
h--;
coboara(1);
return heap[h+1];
}
void init()
{
int i;
for(i=1;i<=n;i++)
{
d[i]=int(2e9);
heap[i]=i;
poz[heap[i]]=i;
}
d[s]=0;
h=n;
}
void dijkstra()
{
int i,x;
while(h!=0)
{
u=extract();
S[++S[0]]=u;
x=v[u].size();
for(i=0;i<x;i++)
if(d[v[u][i]]>d[u]+w[u][i]){
d[v[u][i]]=d[u]+w[u][i];
urca(poz[v[u][i]]);
}
}
}
int main()
{
int i,x,y,c;
ifstream fi("dijkstra.in");
ofstream fo("dijkstra.out");
fi>>n>>m;
for(i=1;i<=m;i++)
{
fi>>x>>y>>c;
v[x].push_back(y);
w[x].push_back(c);
}
init();
dijkstra();
for(i=2;i<=n;i++) if (d[i]==int(2e9)) fo<<"0 "; else fo<<d[i]<<" ";
return 0;
}