Pagini recente » Cod sursa (job #3325852) | Cod sursa (job #1233802) | Cod sursa (job #3158335) | Cod sursa (job #1837055) | Cod sursa (job #807293)
Cod sursa(job #807293)
#include <fstream>
#include <vector>
#define INF 2000000000
using namespace std;
int n, m;
struct NOD
{
int x, cost;
};
vector <NOD> a[50005];
int d[50005];
bool v[50005];
inline void Read()
{
ifstream f("dijkstra.in");
f>>n>>m;
int i, x, y, cost;
NOD aux;
for(i=1; i<=m; i++)
{
f>>x>>y>>cost;
aux.x = y;
aux.cost = cost;
a[x].push_back(aux);
}
f.close();
}
inline void Dijkstra()
{
int i;
for(i=1; i<=n; i++)
{
d[i] = INF;
}
d[1] = 0;
int minim, x, y, cost, k;
bool stop = false;
vector <NOD>::iterator it, final;
NOD aux;
for (int pas = 1; pas<n && !stop; pas++)
{
k = 0;
minim = INF;
for (i = 1; i<=n; i++)
{
if (v[i] == false && d[i] < minim)
{
minim = d[i];
k = i;
}
}
if (minim == INF)
{
stop = true;
}
else
{
v[k] = true;
it = a[k].begin();
final = a[k].end();
for(; it!=final; it++)
{
// parcurg toti adiacentii lui k, pentru care am gasit distanta minima, si ii actualizez si pe ei
aux = *it;
x = aux.x;
cost = aux.cost;
if (d[x] > d[k] + cost)
{
d[x] = d[k] + cost;
}
}
}
}
}
inline void Write()
{
int i;
ofstream g("dijkstra.out");
for(i = 2; i<=n; i++)
{
if (d[i] < INF)
{
g<<d[i]<<" ";
}
else
{
g<<"0 ";
}
}
g<<"\n";
g.close();
}
int main()
{
Read();
Dijkstra();
Write();
return 0;
}