Pagini recente » Cod sursa (job #1004430) | Cod sursa (job #2282434) | Cod sursa (job #1916498) | Cod sursa (job #2955906) | Cod sursa (job #1611241)
#include <fstream>
#define NMAX 50005
#define Inf 1 << 30
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
struct liste{
int neighbour;
int price;
liste *next;
};
int n, m, M[NMAX], d[NMAX];
liste *c[NMAX];
void citire();
void add(int x, int y, int price);
int main()
{
int i, j;
citire();
for(i = 2; i <= n; i++)
d[i] = Inf;
for(i = 2; i <= n; i++)
for(liste *p = c[1]; p != NULL; p=p->next)
if(p->neighbour == i)
d[i] = p->price;
d[1] = 0;
M[1] = 1;
for(j = 1; j < n; j++)
{
int dmin = Inf, vfmin;
for(i = 2; i <= n; i++)
if(!M[i] && dmin > d[i])
{
dmin = d[i];
vfmin = i;
}
M[vfmin] = 1;
for(i = 2; i <= n; i++)
if(!M[i])
for(liste *p = c[vfmin]; p != NULL; p = p->next)
if(p->neighbour == i)
{
if(d[i] > dmin + p->price)
d[i] = dmin + p->price;
break;
}
}
for(i = 2; i <= n; i++)
if(d[i] != Inf)
fout << d[i] << ' ';
else fout << 0 << ' ';
fout << '\n';
return 0;
}
void citire()
{
int i, x, y, cost;
fin >> n >> m;
for(i = 1; i <= m; i++)
{
fin >> x >> y >> cost;
add(x, y, cost);
}
}
void add(int x, int y, int cost)
{
liste *p = new liste;
p->neighbour = y;
p->next = c[x];
p->price = cost;
c[x] = p;
}