您的位置:首页 > 其它

2013-11-18 图专题之01Dijkstra算法(思维逻辑题)

2013-11-18 22:58 260 查看
题目

程序实现图的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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: