图的最短路径算法Dijkstra算法
2015-07-06 19:59
344 查看
#include <stdio.h> #include <stdlib.h> #define QUEUE_MAXSIZE 30 #define VERTEX_MAX 26 #define MAXVALUE 99999 typedef struct { char Vertex[VERTEX_MAX];//保存顶点信息,序号或字母 int Edges[VERTEX_MAX][VERTEX_MAX];//保存边的权 int isTrav[VERTEX_MAX];//遍历标志 int VertexNum;//顶点的数量 int EdgeNum;//边的数量 int GraphType;//图的类型,0:无向图;1:有向图 }MatrixGraph; void CreateMatrixGraph(MatrixGraph *G);//创建邻接矩阵图 void OutMatrix(MatrixGraph *G);//输出邻接矩阵 /************************************************************************ 函数名称:CreateMatrixGraph 函数功能:创建邻接矩阵图 函数参数:G是定义的图结构的指针 函数返回:无 ************************************************************************/ void CreateMatrixGraph(MatrixGraph *G) { int i, j, k, weight; char start, end; printf("输入各个顶点的信息\n"); for (i = 0; i < G->VertexNum; i++) { getchar(); printf("第%d个顶点:", i+1); scanf("%c", &(G->Vertex[i])); } printf("输入构成各边的两个顶点及权值(用逗号分隔):\n"); for (k = 0; k < G->EdgeNum; k++) { getchar(); printf("第%d条边:", k+1); scanf("%c,%c,%d", &start, &end, &weight); for (i = 0; start != G->Vertex[i]; i++);//在已有顶点中查找起始点 for (j = 0; end != G->Vertex[j]; j++);//在已有顶点中查找终点 G->Edges[i][j] = weight; if (G->GraphType == 0) G->Edges[j][i] = weight; } } /************************************************************************ 函数名称:OutMatrix 函数功能:输出邻接矩阵 函数参数:G是定义的图结构的指针 函数返回:无 ************************************************************************/ void OutMatrix(MatrixGraph *G) { int i, j; for (j = 0; j < G->VertexNum; j++) { printf("\t%c", G->Vertex[j]); } printf("\n"); printf(" ------------------------------------\n"); for (i = 0; i < G->VertexNum; i++) { printf(" %c |", G->Vertex[i]); for (j = 0; j < G->VertexNum; j++) { if (G->Edges[i][j] == MAXVALUE) printf("\t∞"); else printf("\t%d", G->Edges[i][j]); } printf("\n"); } printf("\n"); } /************************************************************************ 函数名称:Dijkstra 函数功能:求顶点1到其它顶点的最短路径 函数参数:图G 函数返回:0表示成功 ************************************************************************/ void Dijkstra(MatrixGraph G) { int weight[VERTEX_MAX]; int path[VERTEX_MAX]; int tmpvertex[VERTEX_MAX]; int i, j, k, v0, min; printf("输入源点的编号:"); scanf("%d", &v0); v0--; for (i =0; i < G.VertexNum; i++) { weight[i] = G.Edges[v0][i];//保存最小权值 if (weight[i] < MAXVALUE && weight[i] > 0) path[i] = v0; tmpvertex[i] = 0;//初始化顶点集合为空 } tmpvertex[v0] = 1;//将顶点v0添加到集合U中 weight[v0] = 0; for (i = 0; i < G.VertexNum; i++) { min = MAXVALUE; k = v0; for (j = 0; j < G.VertexNum; j++) { if (tmpvertex[j] == 0 && weight[j] < min) { min = weight[j]; k = j; } } tmpvertex[k] = 1; for (j = 0; j < G.VertexNum; j++) { if (tmpvertex[j] == 0 && weight[k] + G.Edges[k][j] < weight[j]) { weight[j] = weight[k] + G.Edges[k][j]; path[j] = k; } } } printf("\n顶点%c到各个顶点的最短路径为(终点 -- 源点):\n", G.Vertex[v0]); for (i = 0; i < G.VertexNum; i++) { if (tmpvertex[i] == 1) { k = i; while (k != v0) { j = k; printf("%c -- ", G.Vertex[k]); k = path[k]; } printf("%c\n", G.Vertex[k]); } else printf("%c -- %c:无路径\n", G.Vertex[i], G.Vertex[v0]); } } /************************************************************************ 函数名称:main 函数功能:测试图 函数参数:无 函数返回:0表示成功 ************************************************************************/ int main() { MatrixGraph G; int i, j; char select; do { printf("输入生成图的类型(0:无向图,1:有向图):"); scanf("%d", &G.GraphType); printf("输入图的顶点数量和边数量:"); scanf("%d,%d", &G.VertexNum, &G.EdgeNum); //清空矩阵 for (i = 0; i < G.VertexNum; i++) for (j = 0; j < G.VertexNum; j++) G.Edges[i][j] = MAXVALUE; CreateMatrixGraph(&G); printf("邻接矩阵数据如下:\n"); OutMatrix(&G); printf("最短路径:\n"); Dijkstra(G); printf("继续进行吗?(Y/N)"); scanf("%c", &select); getchar(); }while (select != 'N' && select != 'n'); getchar(); getchar(); return 0; }
相关文章推荐
- 汉诺塔-递归实现
- 里约,我们来了
- 使用队列实时显示波形图实现
- 【Web缓存机制系列】
- Oracle pl/sql中的group by子句不能使用别名,应该这样写。
- Java中只有按值传递,没有按引用传递!
- linux网络设备驱动DM9000驱动分析(4)
- requirejs 基础
- 欢迎使用CSDN-markdown编辑器
- Asp.Net Ajax4.5 未知的服務器標記 問題
- 简单区分VMware的三种网络连接模式(bridged、NAT、host-only)
- 动态树 解题报告
- Wildcard Matching 字符串含?,*匹配
- linux 文件管理
- Android apk的启动过程
- Android全局异常处理(捕获异常,不弹出程序崩溃)
- 【网络流】 HDOJ 4307 Matrix
- 从权限管理看互联网产品的盈利方式
- 如何Android中自定义Navigationbar
- LeetCode100 SameTree java题解