Pagini recente » Cod sursa (job #1443091) | Cod sursa (job #1739062) | Cod sursa (job #2099231) | Cod sursa (job #2753725) | Cod sursa (job #2037016)
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
vector<pair <int, int> > v[50003];
vector<pair <int, int> >::iterator it;
int n, m, i, a, b, c, cost,ok, nod, vecin ,d[50003], f[50003], nr;
int w[50003], poz[50003], num[50003];
void swap(int &a, int &b)
{
int r;
r=a;
a=b;
b=r;
}
void add(int i, int j)
{
int c, p;
ok++;
w[ok]=i;
poz[j]=ok;
num[ok]=j;
c=ok;
p=ok/2;
while(p!=0)
{
if(w[c]<w[p])
{
swap(w[c], w[p]);
swap(num[c], num[p]);
poz[num[c]]=c;
poz[num[p]]=p;
c=p;
p=c/2;
}
else
break;
}
}
void sterge(int loc)
{
int c, p;
p=loc;
c=loc*2;
while(c<=ok)
{
if(w[c+1]<w[c]&&c+1<=ok)
c++;
if(w[p]>w[c])
{
swap(w[c], w[p]);
swap(num[c], num[p]);
poz[num[c]]=c;
poz[num[p]]=p;
p=c;
c=p*2;
}
else
break;
}
}
void scade(int loc)
{
int c, p;
c=loc;
p=loc/2;
while(p!=0)
{
if(w[p]>w[c])
{
swap(w[c], w[p]);
swap(num[c], num[p]);
poz[num[c]]=c;
poz[num[p]]=p;
c=p;
p=c/2;
}
else
break;
}
}
int main()
{
fin>>n>>m;
for(i=1;i<=m;i++)
{
fin>>a>>b>>c;
v[a].push_back(make_pair(b, c));
}
for(i=2;i<=n;i++)
d[i]=10000000;
for(i=1;i<=n;i++)
add(d[i], i);
nr=n;
while(nr>0)
{
nod=num[1];
f[nod]=1;
swap(w[1], w[ok]);
swap(num[1], num[ok]);
poz[num[1]]=1;
poz[num[ok]]=ok;
ok--;
sterge(1);
nr--;
for(it=v[nod].begin();it!=v[nod].end();it++)
{
vecin=it->first;
cost=it->second;
if(f[vecin]==0&&d[vecin]>d[nod]+cost)
{
d[vecin]=d[nod]+cost;
w[poz[vecin]]=d[vecin];
scade(poz[vecin]);
}
}
}
for(i=2;i<=n;i++)
{
if(d[i]==10000000)
fout<<0<<" ";
else
fout<<d[i]<<" ";
}
fin.close();
fout.close();
return 0;
}