#include<stdio.h>
#define MAX 100
#define MAX_WEIGHT 1000
typedef struct Matrix {
char e[MAX];
int edge[MAX][MAX];
int v_num, e_num;
}Matrix;
void Dijkstra(Matrix g, int cost[], int path[], int source);
void printPath(int path[], int terminus);
int main(void) {
Matrix g = {
"hhhaah",
{{MAX_WEIGHT, 4,6,6,MAX_WEIGHT,MAX_WEIGHT,MAX_WEIGHT},
{MAX_WEIGHT,MAX_WEIGHT,1,MAX_WEIGHT,7,MAX_WEIGHT,MAX_WEIGHT},
{MAX_WEIGHT,MAX_WEIGHT,MAX_WEIGHT,MAX_WEIGHT,6,4,MAX_WEIGHT},
{MAX_WEIGHT,MAX_WEIGHT,2,MAX_WEIGHT,MAX_WEIGHT,5,MAX_WEIGHT},
{MAX_WEIGHT,MAX_WEIGHT,MAX_WEIGHT,MAX_WEIGHT,MAX_WEIGHT,MAX_WEIGHT,6},
{MAX_WEIGHT,MAX_WEIGHT,MAX_WEIGHT,MAX_WEIGHT,1,MAX_WEIGHT,8},
{MAX_WEIGHT,MAX_WEIGHT,MAX_WEIGHT,MAX_WEIGHT,MAX_WEIGHT,MAX_WEIGHT,MAX_WEIGHT},
},
7,7
};
int cost[MAX],path[MAX];
Dijkstra(g, cost, path, 0);
printPath(path ,5);
putchar('\n');
system("pause");
return 0;
}
void Dijkstra(Matrix g, int cost[], int path[], int source) {
int i, j, min, set[MAX], k;
for (i = 0; i < g.v_num; ++i) {
cost[i] = g.edge[source][i];
set[i] = 0;
if (cost[i] != MAX_WEIGHT)
path[i] = source;
else path[i] = -1;
}
set[source] = 1;
for (i = 0; i < g.v_num - 1; ++i) {
min = MAX_WEIGHT;
for (j = 0; j < g.v_num; ++j) {
if (set[j] == 0 && min > cost[j]) {
min = cost[j];
k = j;
}
}
set[k] = 1;
for (j = 0; j < g.v_num; ++j) {
if (set[j] == 0 && cost[j] > cost[k] + g.edge[k][j]) {
cost[j] = cost[k] + g.edge[k][j];
path[j] = k;
}
}
}
}
void printPath(int path[], int terminus) {
int stack[MAX], i = terminus, top =-1;
stack[++top] = i;
while (path[i] != -1) {
stack[++top] = path[i];
i = path[i];
}
while ( top != -1)
printf("%d ", stack[top--]);
}