eigenmath/187.c
George Weigt cbeb842ffd add
2005-11-29 12:34:11 -07:00

177 lines
2.2 KiB
C

/* Dijkstra shortest path algorithm demo */
#define YA 1
#define YB 2
#define YC 3
#define YD 4
#define YE 5
#define YF 6
#define YG 7
#define YH 8
#define N 8
#define M 1000000
int n, A[100][100], d[100], s[100], IN[100];
int x = 1, y = 8;
char *city[9] = {
"",
"New York",
"Cleveland",
"St. Louis",
"Nashville",
"Phoenix",
"Dallas",
"Salt Lake",
"Los Angeles",
};
main()
{
int i, j, p, z, OldDistance, iteration = 0;
for (i = 0; i < 100; i++)
for (j = 0; j < 100; j++)
A[i][j] = M;
A[1][2] = 400;
A[1][3] = 900;
A[1][4] = 800;
A[2][5] = 1800;
A[2][6] = 900;
A[3][5] = 1100;
A[3][6] = 600;
A[4][6] = 600;
A[4][7] = 1200;
A[5][8] = 400;
A[5][6] = 900;
A[6][8] = 1300;
A[6][7] = 1000;
A[7][8] = 600;
IN[1] = x;
n = 1;
d[x] = 0;
for (z = 1; z <= N; z++)
if (!in(z)) {
d[z] = A[x][z];
s[z] = x;
}
while (!in(y)) {
printf("Iteration %d\n\n", ++iteration);
for (i = 2; i <= 8; i++)
if (d[i] < M) {
printf("%5d ", d[i]);
print_path(i);
printf("\n");
}
printf("\n");
p = minz();
printf("The least cost is %s, make it [permanent]\n\n", city[p]);
// printf("\np = %d\n", p);
if (p == 0) {
printf("No path.\n");
exit(1);
}
IN[++n] = p;
for (z = 1; z <= N; z++)
if (!in(z)) {
OldDistance = d[z];
d[z] = min(d[z], d[p] + A[p][z]);
if (d[z] != OldDistance)
s[z] = p;
}
// print_state();
}
#if 0
printf("In reverse order, the path is\n");
printf("%d\n", y);
z = y;
do {
printf("%d\n", s[z]);
z = s[z];
} while (z != x);
#endif
}
print_path(int n)
{
if (n == 1)
printf("[New York]");
else {
print_path(s[n]);
if (in(n))
printf(" - [%s]", city[n]);
else
printf(" - %s", city[n]);
}
}
int min(int x, int y)
{
if (x <= y)
return x;
else
return y;
}
int in(int z)
{
int i;
for (i = 1; i <= n; i++)
if (IN[i] == z)
return 1;
return 0;
}
int minz()
{
int w, z, p;
w = M;
p = 0;
for (z = 1; z <= N; z++)
if (!in(z) && d[z] < w) {
w = d[z];
p = z;
}
return p;
}
print_state()
{
int i;
printf("IN =");
for (i = 1; i <= n; i++)
printf(" %d", IN[i]);
printf("\n");
printf("d =");
for (i = 1; i <= N; i++)
printf(" %d", d[i]);
printf("\n");
printf("s =");
for (i = 1; i <= N; i++)
printf(" %d", s[i]);
printf("\n");
}