Pagini recente » Istoria paginii utilizator/cartofen | Cod sursa (job #2187918) | Cod sursa (job #1815235) | Cod sursa (job #2056618) | Cod sursa (job #1176076)
//comparare Dijkstra cu/fara priority_queue STL (varianta fara)
#include <fstream>
#include <vector>
#define MX 50001
#define NUMAR 2000000000
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
int n,m;
struct vecin
{
int j,c;
};
vector<vecin> v[MX];
vector<int> p;
int np,viz[MX],d[MX];
void citire()
{
int i,a,b,c;
vecin e;
fin>>n>>m;
for(i=1; i<=m; i++)
{
fin>>a>>b>>c;
e.j = b;
e.c = c;
v[a].push_back(e);
}
}
void reconstituie(int i)
{
int minim,aux;
minim = i;
if(2*i <= np)
{
if(d[p[2*i]] < d[p[minim]]) minim = 2*i;
}
if(2*i+1 <= np)
{
if(d[p[2*i+1]] < d[p[minim]]) minim = 2*i+1;
}
if(minim != i)
{
aux = p[i];
p[i] = p[minim];
p[minim] = aux;
reconstituie(minim);
}
}
void PUSH(int x)
{
np++;
p.push_back(NUMAR);
int mn=np;
while(mn>1 && d[p[mn/2]]>d[x])
{
p[mn] = p[mn/2];
mn /= 2;
}
p[mn] = x;
}
int TOP()
{
return p[1];
}
void POP()
{
int aux;
aux = p[1];
p[1] = p[np];
p[np] = aux;
np--;
p.pop_back();
reconstituie(1);
}
void Dijkstra()
{
int i,u,r;
vecin e;
vector<vecin>::iterator it;
for(i=1; i<=n; i++)
{
d[i] = NUMAR;
PUSH(i);
}
d[1] = 0;
PUSH(1);
while(np)
{
u = TOP();
POP();
if(viz[u] == 0)
{
for(it=v[u].begin(); it!=v[u].end(); it++)
{
e = *it;
r = d[u]+e.c;
if(r < d[e.j])
{
d[e.j] = r;
PUSH(e.j);
}
}
viz[u] = 1;
}
}
}
void afisare()
{
int i;
for(i=2; i<=n; i++)
{
if(d[i] == NUMAR) fout<<0<<' ';
else fout<<d[i]<<' ';
}
}
int main()
{
citire();
p.push_back(NUMAR);
Dijkstra();
afisare();
fin.close(); fout.close();
return 0;
}