题目
程序实现图的Dijkstra算法
注意事项
图的存储采用矩阵结构
本算法算出了所有顶点到其余各顶点的最小路径。
本算法时间复杂度O(n*n*n)
本算法空间复杂度O(n*n)
程序实现
#include<stdio.h>
#include<stdlib.h>
int vertix_num;
unsigned int **graph_weight;
unsigned int **graph_distance;
unsigned int vertix_count;
unsigned int **source_vertix;
void output_graph()
{
int i;
int j;
for( i = 0; i < vertix_num;i++){
for(j = 0; j < vertix_num; j++){
printf("%-4d ", graph_weight[i][j]);
}
printf("\n");
}
}
void output_distance()
{
int i;
int j;
for( i = 0; i < vertix_num;i++){
for(j = 0; j < vertix_num; j++){
printf("%-4d ", graph_distance[i][j]);
}
printf("\n");
}
}
int is_in_source_vertix(int source_id, int temp)
{
int i;
for(i = 0; i < vertix_count;i++){
if(source_vertix[source_id][i] == temp){
return 0;
}
}
return 1;
}
void generate_minest_diatance(int source_id)
{
int i;
int j;
int min =100000;
int temp;
int vetix1;
int vetix2;
int flag = 0;
for( i = 0; i < vertix_count;i++){
temp = source_vertix[source_id][i];
for(j = 0; j < vertix_num; j++){
if(graph_weight[temp][j] > 0 && graph_distance[source_id][temp]+graph_weight[temp][j] < min && is_in_source_vertix(source_id, j)){
min = graph_weight[temp][j];
vetix2 = j;
vetix1 = temp;
flag = 1;
}
}
}
if(flag == 0){
return;
}
source_vertix[source_id][vertix_count++] = vetix2;
graph_distance[source_id][vetix2] = graph_distance[source_id][vetix1] + min;
generate_minest_diatance(source_id);
}
void produce_the_graph()
{
source_vertix = (unsigned int **)malloc(sizeof(int* ) * vertix_num);
graph_weight = (unsigned int **)malloc(sizeof(int *) * vertix_num);
graph_distance = (unsigned int **)malloc(sizeof(int *) * vertix_num);
int i;
for(i = 0; i < vertix_num; i++){
source_vertix[i] = (unsigned int *)malloc(sizeof(int ) * vertix_num);
graph_weight[i] = (unsigned int *)malloc(sizeof(int ) * vertix_num);
graph_distance[i] = (unsigned int *)malloc(sizeof(int ) * vertix_num);
}
int j;
for(i = 0; i < vertix_num; i++){
for(j = 0; j< vertix_num; j++){
scanf("%d", &graph_weight[i][j]);
graph_distance[i][j] = 0;
}
}
//output_graph();
for(i = 0; i < vertix_num; i++){
vertix_count = 0;
source_vertix[i][vertix_count++] = i;
generate_minest_diatance(i);
}
}
void free_mem()
{
int i;
for(i = 0; i < vertix_num; i++){
free(graph_weight[i]);
free(source_vertix [i]);
free(graph_distance[i]);
}
free(graph_weight);
free(source_vertix);
free(graph_distance);
}
int main(void)
{
printf("1000 means +OO\n");
scanf("%d", &vertix_num);
produce_the_graph();
printf("\nthe minest distance arry is :\n");
output_distance();
free_mem();
}