Pagini recente » Profil duxdeorum | Istoria paginii utilizator/maria_coteanu | Cod sursa (job #85864) | Cod sursa (job #2022294) | Cod sursa (job #1439056)
#include<fstream>
#include<vector>
using namespace std;
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");
struct muchie
{
int nod,cost;
};
int n,m,d[50004],p[50004],h[50004];
void swp(int i,int j)
{
int aux;
aux=h[i];
h[i]=h[j];
h[j]=aux;
aux=p[h[i]];
p[h[i]]=p[h[j]];
p[h[j]]=aux;
}
void upheap(int i)
{
if(d[h[i/2]]<d[h[i]])
return;
swp(i,i/2);
upheap(i/2);
}
void downheap(int i)
{
int st,dr;
if(i*2>m)
return;
st=d[h[i*2]];
if(i*2+1<=m)
dr=d[h[i*2+1]];
else
dr=st+1;
if(st<dr)
{
if(d[h[i]]<=st)
return;
swp(i,2*i);
downheap(i*2);
}
else
{
if(d[h[i]]<=dr)
return;
swp(i,2*i+1);
downheap(2*i+1);
}
}
vector<muchie> a[50004];
int main()
{
f>>n>>m;
for(int i=0;i<m;i++)
{
muchie l;
int x,y,c;
f>>x>>y>>c;
l.nod=y;l.cost=c;
a[x].push_back(l);
l.nod=x;
a[y].push_back(l);
}
for(int i=1;i<=n;i++)
{
d[i]=50000007;
h[i]=i;
p[i]=i;
}
int poz=n;
d[1]=0;
while(poz)
{
int k=h[1];
swp(1,poz);
poz--;
downheap(1);
int l=a[k].size();
for(int j=0;j<l;j++)
if(d[a[k][j].nod]>d[k]+a[k][j].cost)
{
d[a[k][j].nod]=d[k]+a[k][j].cost;
upheap(a[k][j].nod);
}
}
for(int i=2;i<=n;i++)
{
if(d[i]<50000007)
g<<d[i]<<' ';
else
g<<"0 ";
}
f.close();g.close();
return 0;
}