最短路径 Dijkstra算法
2012-04-13 14:21
162 查看
#include "stdio.h" #define INFINITY 100 #define MAX_VERTEX_NUM 20 struct MGraph { char vexs[MAX_VERTEX_NUM]; int arcs[6][6]; int vexnum, arcnum; }; /*记录路径的数组, to[i].before 表示 v0 到 vi 的次短路径节点*/ struct PathArray{ int before; }to[6]; /*lenth[i]表示v0到vi的最短路径长度*/ void myshortestpathfun(MGraph g, int v0, PathArray to[6], int lenth[6]) { int i, j, k, t, num, temp[6];//temp[i]=1表示vi已经在最短路径上了,temp[i]= 0表示vi还不在最短路径上; /*初始化*/ for (i = 0; i < 6; i++) { to[i].before = INFINITY; lenth[i] = INFINITY; temp[i] = 0; } /*第一轮比较*/ for (i = 0; i < 6; i ++) { if (g.arcs[v0][i] < INFINITY) { to[i].before = v0; lenth[i] = g.arcs[v0][i]; } } temp[v0] = 1; //v0已经在最短路径了; /*找出v0到vi中最短的一点vi,将节点下标保存到t中*/ int temp2 = INFINITY; for (i = 0; i < 6; i++) { if (1 == temp[i]) continue; //从不在最短路径上的那些点中找出最短的; if (lenth[i] < temp2) { temp2 = lenth[i]; t = i; } } for (num = 0; num < 5; num++) //再比较5轮; { for (i = 0; i < 6; i++) { if (g.arcs[t][i] + lenth[t] < lenth[i]) { to[i].before = t; lenth[i] = g.arcs[t][i] + lenth[t]; } } temp[t] = 1; //vt已经在最短路径了; temp2 = INFINITY; for (i = 0; i < 6; i++) { if (1 == temp[i]) continue; if (lenth[i] < temp2) { temp2 = lenth[i]; t = i; } } } printf("\nv%d 到各点的最短距离是:\n\n",v0); for (num = 0; num < 6; num++) { printf("v%d -> v%d : %d\n", v0, num, lenth[num]); } printf("\n\n"); printf("v%d 到各点的最短路径: \n\n",v0); for (j = 0; j < 6; j++) { printf("v%d -> v%d path:\t ",v0, j); printf("v%d <- ", j); for (i = j; to[i].before != v0; ) { printf("v%d <- ", to[i].before); i = to[i].before; } printf("v%d", v0); printf("\n"); } } int main() { int i,j; int p[6]; int d[6]; PathArray to[6]; int lenth[6]; MGraph a; int arcs1[6][6]= { INFINITY,5,INFINITY,7,INFINITY,INFINITY, INFINITY,INFINITY,4,INFINITY,INFINITY,INFINITY, 8,INFINITY,INFINITY,INFINITY,INFINITY,9, INFINITY,INFINITY,5,INFINITY,INFINITY,6, INFINITY,INFINITY,INFINITY,5,INFINITY,INFINITY, 3,INFINITY,INFINITY,INFINITY,1,INFINITY}; int vexs1[] = {1,2,3,4,5,6}; for(i = 0; i < 6;i++) { a.vexs[i] = vexs1[i]; } /*初始化*/ a.vexnum = 6; a.arcnum = 10; for(i = 0;i < a.vexnum; i++ ) for(j = 0;j < a.vexnum;j++) { a.arcs[i][j] = arcs1[i][j]; } printf("各节点的邻接关系为 :\n\n"); for (i = 0; i < 6; i++) { printf("\tv%d",i); } printf("\n"); for (i = 0; i < a.vexnum; i++) { printf("v%d\t",i); for(j = 0; j < a.vexnum; j++) { printf("%d\t",a.arcs[i][j]); } printf("\n"); } for (i = 0; i < 6; i++) { myshortestpathfun(a, i, to, lenth); printf("\n"); } return 0; }
相关文章推荐
- 数据结构与算法——最短路径Dijkstra算法的C++实现
- 最短路径—Dijkstra算法和Floyd算法
- 单源最短路径问题之dijkstra算法
- POJ 3268 Silver Cow Party(最短路径dijkstra算法)
- 利用Dijkstra算法实现记录每个结点的所有最短路径
- 【最短路径】之Dijkstra算法
- 【最短路径之Dijkstra算法详细讲解 】
- Java数据结构----图--最短路径解法Dijkstra算法和Floyd算法
- 单源最短路径之Dijkstra算法
- 最短路径—Dijkstra算法和Floyd算法
- HDU 3790 最短路径问题 (Dijkstra算法)
- HDU 3790 最短路径问题(单源最短路---Dijkstra算法)
- 最短路径—Dijkstra算法和Floyd算法
- 单源最短路径—Bellman-Ford和Dijkstra算法
- [c]HDOJ1874 Dijkstra算法求最短路径
- [SDOI2010] BZOJ 1922 大陆争霸-图论-最短路径-dijkstra算法
- POJ 3268 Silver Cow Party(找最短路径的最大值+两次Dijkstra算法)
- 带权路径最短——Dijkstra算法
- SPFA算法与dijkstra算法求单源最短路径的比较
- 【转】Dijkstra算法(单源最短路径)