Pagini recente » Cod sursa (job #1345730) | Cod sursa (job #915732) | Cod sursa (job #1264303) | Cod sursa (job #2065942) | Cod sursa (job #2269656)
#include <fstream>
#include <vector>
#include <climits>
using namespace std;
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");
vector <int> a[50100];
vector <int> d[50100];
struct dist
{
int poz,val;
}D[50100];
int n,fv[50100],w[50100],viz[50100];
void up(int p)
{
if(p>1&&D[p].val<D[p/2].val)
{
swap(D[p],D[p/2]);
fv[D[p].poz]=p;
fv[D[p/2].poz]=p/2;
up(p/2);
}
}
void down(int p)
{
if(2*p+1<=n&&(D[p].val>D[2*p].val||D[p].val>D[2*p+1].val))
{
if(D[2*p].val<D[2*p+1].val)
{
swap(D[2*p],D[p]);
fv[D[p].poz]=p;
fv[D[2*p].poz]=2*p;
down(2*p);
}
else
{
swap(D[2*p+1],D[p]);
fv[D[p].poz]=p;
fv[D[2*p+1].poz]=2*p+1;
down(2*p+1);
}
}
else if(2*p<=n&&D[p].val>D[2*p].val)
{
swap(D[p],D[2*p]);
fv[D[p].poz]=p;
fv[D[2*p].poz]=2*p;
}
}
void dijkstra(int s)
{
int i,k,mini,x;
for(i=1;i<=n;i++)
{
D[i].val=INT_MAX/2;
D[i].poz=i;
}
w[s]=0;
D[s].val=0;
up(s);
for(k=1;k<=n;k++)
{
mini=D[1].val;
x=D[1].poz;
if(mini!=INT_MAX/2)
{
D[1].val=INT_MAX/2;
down(1);
for(i=0;i<a[x].size();i++)
{
if(w[a[x][i]]>mini+d[x][i])
{
w[a[x][i]]=mini+d[x][i];
D[fv[a[x][i]]].val=mini+d[x][i];
up(fv[a[x][i]]);
}
}
}
}
}
int m,i,x,j,cost,y;
int main()
{
f>>n>>m;
for(i=1;i<=n;i++)
{
D[i].val=INT_MAX/2;
D[i].poz=i;
fv[i]=i;
w[i]=INT_MAX/2;
}
for(i=1;i<=m;i++)
{
f>>x>>y>>cost;
a[x].push_back(y);
d[x].push_back(cost);
}
dijkstra(1);
for(j=2;j<=n;j++)
if(w[j]==INT_MAX/2)g<<0<<" ";
else g<<w[j]<<" ";
return 0;
}