Pagini recente » Cod sursa (job #2630223) | Cod sursa (job #857666) | Cod sursa (job #583526) | Cod sursa (job #2415253) | Cod sursa (job #1139698)
#include <fstream>
#include <iostream>
using namespace std;
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");
const int MAXN=20010, INF = (0x0f0f0f)/2;
int N, M, minim, k;
int c[MAXN][MAXN], selected[MAXN], ant[MAXN], d[MAXN];
void read()
{
int x, y, cost;
f >> N >> M;
for(int i = 1; i <= N; ++i)
for(int j = 1; j <= N; ++j)
if(i == j)
c[i][j] = c[j][i] = 0;
else
c[i][j] = c[j][i] = INF;
for(int i = 0; i < M; ++i)
{
f >> x >> y >> cost;
c[x][y] = cost;
}
}
void dijkstra()
{
for(int i = 1; i <= N; ++i)
{
d[i] = c[1][i];
if(d[i] < INF)
ant[i] = 1;
}
selected[1] = 1;
for(bool ok = true; ok;)
{
minim = INF;
for(int i = 1; i <= N; ++i)
if(!selected[i] && d[i] < minim)
minim = d[i], k = i;
if(minim == INF)
ok = false;
else
{
selected[k] = 1;
for(int i = 1; i <= N; ++i)
if(!selected[i] && d[k] + c[k][i] < d[i])
d[i] = d[k] + c[k][i], ant[i] = k;
}
}
}
void debug()
{
for(int i = 1; i <= N; ++i)
{
for(int j = 1; j <= N; ++j)
cout << c[i][j] << " ";
cout << "\n";
}
}
int main()
{
read();
dijkstra();
for(int i = 2; i <= N; ++i)
if(d[i] < INF)
g << d[i] << " ";
else
g << 0 << " ";
//debug();
}