
#define W 100
#define H 100
#define INF 0x3f3f3f3f
#define SIZE 6
int matrix[W][H];
int dist[SIZE] = {0};
int prev[SIZE] = {0};
void printv(int v) {
if(v>1000) {
printf("AA ");
} else {
printf("%02d ",v);
}
}
void init(){
memset(matrix, INF, sizeof(matrix));
matrix[0][1]=1;
matrix[0][2]=12;
matrix[1][2]=9;
matrix[1][3]=3;
matrix[2][4]=5;
matrix[3][4]=13;
matrix[3][5]=17;
matrix[4][5]=4;
printf("\n");
for(int i=0;i<SIZE;i++) {
for(int j=0;j<SIZE;j++) {
printv(matrix[i][j]);
}
printf("\n");
}
}
void dijistra() {
for (int i=0; i<SIZE; i++) {
dist[i] = matrix[0][i];
}
int index = 0;
int flag[SIZE] = {0};
for (int i=1; i<SIZE; i++) {
int min = INF;
for (int j=0; j<SIZE; j++) {
if(flag[j]==0 && dist[j] < min) {
index = j;
min = dist[j];
}
}
flag[index] = 1;
printf("\n节点:%d\n",index);
for (int j=0; j<SIZE; j++) {
int tmp = matrix[index][j] == INF ? INF : matrix[index][j] + min;
if(flag[j] == 0 && tmp < dist[j]) {
dist[j] = tmp;
prev[j] = index;
}
}
printf("\n");
for (int k=0; k<SIZE; k++) {
printv(dist[k]);
}
printf("\n");
}
}
void print_all_path() {
for(int i=1;i<SIZE;i++) {
printf("\n节点:%d,距离%d,前置节点:%d,路径:", i, dist[i], prev[i]);
int node = i;
int arr[SIZE] = {0};
int j=0;
while(prev[node]) {
arr[j++] = prev[node];
node = prev[node];
}
for (;j>=0; j--) {
printf("%d->", arr[j]);
}
printf("%d", i);
}
}
void test() {
init();
dijistra();
print_all_path();
}
int main()
{
test();
return 0;
}