一步一步复习数据结构和算法基础-dijkstra算法
2012-07-25 10:50
661 查看
#include<stdio.h> #include<stdlib.h> #include<string.h> #define number 20 #define MAX 999999 int d[number]; typedef struct node { int info; //图的节点存放的信息,可随时变动 }GraphNode; typedef struct { GraphNode matrix[number+1][number+1]; //构造邻接矩阵 int vexs[number+1]; //顶点向量 int vertex,edge; //顶点个数、弧个数 }Graph; //创建图 void CreatGraph(Graph *G) { int i,k; int x,y,data; int vertex,edge; printf("输入图的顶点个数和边的个数.\n"); scanf("%d%d",&vertex,&edge); G->vertex = vertex;G->edge = edge; printf("输入图的每个顶点.\n"); for(i=1;i<=vertex;i++) scanf("%d",&G->vexs[i]); for(i=1;i<=vertex;i++) for(k=1;k<=vertex;k++) { if(i == k)G->matrix[i][k].info=0; else G->matrix[i][k].info = MAX; } printf("请输入 %d 条边的横坐标、纵坐标、数值.\n",edge); for(i=1;i<=edge;i++) { scanf("%d%d%d",&x,&y,&data); G->matrix[x][y].info=data; } } void RecoverGraph(Graph *G) { int i,k; for(i=1;i<=G->vertex;i++) for(k=1;k<=G->vertex;k++) G->matrix[i][k].info=0; memset(G->vexs,0,sizeof(G->vexs)); G->vertex = G->edge = 0; } void Dijkstra(Graph *G,int start) { int v,min,w,i; int final[number]; for(v=1;v<=G->vertex;v++) { final[v] = 0; d[v] = G->matrix[start][v].info; } d[start] = 0;final[start]=1; for(i=2;i<=G->vertex;i++) { min = 99999; for(w=1;w<=G->vertex;w++) if(!final[w]) if(d[w] < min){v=w;min = d[w];} final[v] = 1; for(w=1;w<=G->vertex;w++) { if(!final[w] && min + G->matrix[v][w].info < d[w]) d[w] = min + G->matrix[v][w].info; } } } void ShowPath(Graph *G,int start) { int i; printf("\n\n"); for(i=1;i<=G->vertex;i++) { if(d[i] == MAX) printf("顶点 %d 到顶点 %d 不连通.\n"); else printf("顶点 %d 到顶点 %d 最短距离是 %d \n",G->vexs[start],G->vexs[i],d[i]); } printf("\n"); } int main() { Graph G; int start; CreatGraph(&G); printf("输入出发的顶点.\n"); scanf("%d",&start); Dijkstra(&G,start); ShowPath(&G,start); RecoverGraph(&G); return 0; } /* 6 8 1 2 3 4 5 6 1 3 10 1 5 30 1 6 100 2 3 5 3 4 50 5 4 20 5 6 60 4 6 10 */
相关文章推荐
- 一步一步复习数据结构和算法基础-层次建立层次遍历二叉树
- 一步一步复习数据结构和算法基础-链式队列
- 一步一步复习数据结构和算法基础-冒泡排序
- 一步一步复习数据结构和算法基础-栈和队列(1)
- 一步一步复习数据结构和算法基础-广度优先搜索
- 一步一步复习数据结构和算法基础-插入排序(2)
- 一步一步复习数据结构和算法基础-Floyd算法
- 一步一步复习数据结构和算法基础-线性表
- 一步一步复习数据结构和算法基础--kruskal算法
- 一步一步复习数据结构和算法基础-索引顺序表查找
- 一步一步复习数据结构和算法基础-单链表冒泡排序
- 一步一步复习数据结构和算法基础-前序线索二叉树
- 一步一步复习数据结构和算法基础-快速排序
- 一步一步复习数据结构和算法基础-顺序查找+二分查找
- 一步一步复习数据结构和算法基础-斐波那契查找法
- 一步一步复习数据结构和算法基础-顺序串
- 一步一步复习数据结构和算法基础-二叉排序树
- 一步一步复习数据结构和算法基础(1)
- 一步一步复习数据结构和算法基础-二叉树基本操作
- 一步一步复习数据结构和算法基础-堆排序