图的最短路径(C++实现)

  1 #include <iostream>
  2 using namespace std ;
  3
  4 #define MAXVERTEXNUM 100
  5 struct Graph
  6 {
  7   int VertexNum ;
  8   char Vertex[MAXVERTEXNUM] ;
  9   int AdjMatrix[MAXVERTEXNUM][MAXVERTEXNUM] ;
 10 } ;
 11
 12 Graph MGraph ;
 13
 14
 15 #define INFINITY 100
 16 void CreateGraph (Graph *G)
 17 {
 18   int i , j ;
 19
 20   cin >> G-> VertexNum ;
 21   for (i = 1 ; i <= G->VertexNum ; i++)
 22   {
 23     cin >> G->Vertex[i] ;
 24   }
 25   for (i = 1 ; i <= G->VertexNum ; i++)
 26   {
 27     for (j = 1 ; j <= G->VertexNum ; j++)
 28     {
 29       cin >> G->AdjMatrix[i][j] ;
 30       if (G->AdjMatrix[i][j] == -1)
 31       {
 32         G->AdjMatrix[i][j] = INFINITY ;
 33       }
 34     }
 35   }
 36 }
 37
 38
 39 void ShowGraph (Graph *G)
 40 {
 41   int i , j ;
 42
 43   for (i = 1 ; i <= G->VertexNum ; i++)
 44   {
 45     cout << G->Vertex[i] << " " ;
 46   }
 47   cout << endl ;
 48
 49   for (i = 1 ; i <= G->VertexNum ; i++)
 50   {
 51     for (j = 1 ; j <= G->VertexNum ; j++)
 52     {
 53       cout << G->AdjMatrix[i][j] << " " ;
 54     }
 55     cout << endl ;
 56   }
 57 }
 58
 59 char Path[MAXVERTEXNUM][MAXVERTEXNUM] ;
 60 int Dest[MAXVERTEXNUM] ;
 61 void ShortestPath (Graph *G , char StartVexChar)
 62 {
 63   int i , j , m , StartVex , CurrentVex , MinDest ;
 64   int Final[MAXVERTEXNUM] ;
 65
 66
 67   for (i = 1 ; j <= G->VertexNum ; i++)
 68   {
 69     if (G->Vertex[i] == StartVexChar)
 70     {
 71       StartVex = i ;
 72       break ;
 73     }
 74   }
 75
 76   for (i = 1 ; i <= G->VertexNum ; i++)
 77   {
 78     Path[i][0] = 0 ;
 79     Dest[i] = INFINITY ;
 80     if (G->AdjMatrix[StartVex][i] < INFINITY)
 81     {
 82       Dest[i] = G->AdjMatrix[StartVex][i] ;
 83       Path[i][1] = G->Vertex[StartVex] ;
 84       Path[i][2] = G->Vertex[i] ;
 85       Path[i][0] = 2 ;
 86     }
 87     Final[i] = ‘F‘ ;
 88   }
 89   Dest[StartVex] = 0 ;
 90   Final[StartVex] = ‘T‘ ;
 91   for (i = 1 ; i <= G->VertexNum ; i++)
 92   {
 93     MinDest = INFINITY ;
 94     for (j = 1 ; j <= G->VertexNum ; j++)
 95     {
 96       if (Final[j] == ‘F‘)
 97       {
 98         if (Dest[j] < MinDest)
 99         {
100           CurrentVex = j ;
101           MinDest = Dest[j] ;
102         }
103       }
104     }
105     Final[CurrentVex] = ‘T‘ ;
106     for (j = 1 ; j <= G->VertexNum ; j++)
107     {
108       if ((Final[j] == ‘F‘) && (MinDest + G->AdjMatrix[CurrentVex][j] < Dest[j]))
109       {
110         Dest[j] = MinDest + G->AdjMatrix[CurrentVex][j] ;
111
112         for (m = 0 ; m <= Path[CurrentVex][0] ; m++)
113         {
114           Path[j][m] = Path[CurrentVex][m] ;
115         }
116         Path[j][0]++ ;
117         Path[j][Path[j][0]] = G->Vertex[j] ;
118       }
119     }
120   }
121 }
122
123 void ShowPath (Graph *G)
124 {
125   int i , j ;
126
127   for (i = 1 ; i <= G->VertexNum ; i++)
128   {
129     cout << G->Vertex[i] << "(" << Dest[i] << ") : " ;
130     if (Path[i][0] > 0)
131     {
132       for (j = 1 ; j < G->VertexNum ; j++)
133       {
134         cout << " " << Path[i][j] ;
135       }
136     }
137     cout << endl ;
138   }
139 }
140
141 int main ()
142 {
143   char StartVex ;
144
145   CreateGraph (&MGraph) ;
146   ShowGraph (&MGraph) ;
147
148   cin >> StartVex ;
149   ShortestPath (&MGraph , StartVex) ;
150   ShowPath (&MGraph) ;
151
152   return 0 ;
153
154 }
时间: 2024-10-23 06:26:06

图的最短路径(C++实现)的相关文章

数据结构 -- 图的最短路径 Java版

作者版权所有,转载请注明出处,多谢.http://www.cnblogs.com/Henvealf/p/5574455.html 上一篇介绍了有关图的表示和遍历实现.数据结构 -- 简单图的实现与遍历 (Java)现在就来看看关于求图的最短路径的问题: 注意:本人学习图的时候看的书是: <<数据结构与算法 Java语言版>> (美)Adam Drozdek/著 周翔/译 机械工业出版社出版 由于要仔细讲解内容过多并且本人水平有限,推荐大家找出这本书来看,本篇文章主要是对其中Dijk

带权图的最短路径算法(Dijkstra)实现

一,介绍 本文实现带权图的最短路径算法.给定图中一个顶点,求解该顶点到图中所有其他顶点的最短路径 以及 最短路径的长度.在决定写这篇文章之前,在网上找了很多关于Dijkstra算法实现,但大部分是不带权的.不带权的Dijkstra算法要简单得多(可参考我的另一篇:无向图的最短路径算法JAVA实现):而对于带权的Dijkstra算法,最关键的是如何“更新邻接点的权值”.本文采用最小堆主辅助,以重新构造堆的方式实现更新邻接点权值. 对于图而言,存在有向图和无向图.本算法只需要修改一行代码,即可同时实

有向无环图的最短路径

我们已经知道了如何通过Dijkstra算法在非负权图中找到最短路径.即使图中有负权边,我们也知道通过Bellman-Ford算法找到一个从 给定的源点到其它所有节点的最短路径.现在我们将看到一个在线性时间内运行得更快的算法,它可以在有向无环图中找到从一个给定的源点到其它所有可达顶点的 最短路径,又名有向无环图(DAG). 由于有向无环图无环所以我们不必担心负环的问题.正如我们已经知道在负环里讨论最短路径是毫无意义的一样,因为我们可以在这些环里不断“循环”,但实际上我们得到的路径将变得越来越短(构

贪心算法-图的最短路径算法Dijkstra之证明

一.问题:图的最短路径 定义图G=(V,E),而且每条边上的权值非负,求顶点s 到图中任意一点的最短距离.图中任意两点之间的距离定义为:路径上所有边的权值的和. 二.算法:Dijkstra算法 设S是探查的顶点的集合,对每个,我们存储一个距离d(u) 初始S={s},d(s)=0 While S != V 选择一个顶点使得从S到v至少有一条边并且 把v加入到S并且定义 End 三.证明算法的正确性: 只需证明,在算法执行中任意一点的集合S,对每个,路径是最短的s-u路径. 用数学归纳法证明算法的

动态规划作业-多段图的最短路径问题

多段图的最短路径问题 问题:设图G=(V,E)是一个带权有向图,如果把顶点集合V划分成k个互不相交的子集Vi(2<=k<=n,1<=i<=k), 使得E中的任何一条边<u,v>,必有u∈Vi, v∈Vi+m(1<=i<k,1<i+m<=k),则称图G为多段图,称s∈V1为源点, t∈Vk为终点. 多段图的最短路径问题为从源点到终点的最小代价路径. 子问题:设Cuv表示多段图的有向边<u,v>上的权值,将从源点s到终点t的最短路径长度即

图的最短路径和拓扑排序

图的最短路径 从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径叫做最短路径 图的最短路径有许多重要的应用. 例如:上图中v0-v8有9个点,可以看做不同的地点,现在要规划出v0到其它某个点地点的最短路线规划 构建最短路径中比较常见的一种算法即为dijstra(迪杰斯特拉)算法 二.dijstra(迪杰斯特拉)算法 究竟什么是迪杰斯特拉算法?它是如何寻找图中顶点的最短路径呢? 这个算法的本质,是不断刷新起点与其他各个顶点之间的 “距离表”. 让我们来演示一下迪杰斯特拉

数据结构之图的最短路径

最短路径程序实现: #include<stdio.h> #include<stdlib.h> #define VEXNUM 6//顶点数 #define ARCNUM 10//边数 #define INT_MAX 10000//先定义最大权值: struct Graph{ int vexs[VEXNUM+1];//顶点数组:     int a[VEXNUM+1][VEXNUM+1];//邻接矩阵: int val[VEXNUM+1][VEXNUM+1];//权值: }; void

图中最短路径算法(Dijkstra算法)(转)

1.Dijkstra 1)      适用条件&范围: a)   单源最短路径(从源点s到其它所有顶点v); b)   有向图&无向图(无向图可以看作(u,v),(v,u)同属于边集E的有向图) c)   所有边权非负(任取(i,j)∈E都有Wij≥0); 2)      算法描述: 在带权图中最常遇到的问题就是,寻找两点间的最短路径问题. 解决最短路径问题最著名的算法是Djikstra算法.这个算法的实现基于图的邻接矩阵表示法,它不仅能够找到任意两点的最短路径,还可以找到某个指定点到其他

图(最短路径算法————迪杰斯特拉算法和弗洛伊德算法).RP

文转:http://blog.csdn.net/zxq2574043697/article/details/9451887 一: 最短路径算法 1. 迪杰斯特拉算法 2. 弗洛伊德算法 二: 1. 迪杰斯特拉算法 求从源点到其余各点的最短路径 依最短路径的长度递增的次序求得各条路径 路径长度最短的最短路径的特点: 在这条路径上,必定只含一条弧,并且这条弧的权值最小. 下一条路径长度次短的最短路径的特点: 它只可能有两种情况:或是直接从源点到该点(只含一条弧):或者是从源点经过顶点v1,再到达该顶

广度优先算法解决无向无权图的最短路径问题

从城市1到城市到城市3有很多条路,每条路的路况各不相同,所耗费的时间都标记在了箭头上,现在需要找出从1到3的最短路径. 无向图:意思是来回的路径值是一样的 无权图:意思是每套路径的值是一样的 package myalgorithm; import java.util.LinkedList; import java.util.Queue; /*BFS用于记录的位置和值的结构*/ class node { node(int cur,int valparam) { this.cur = cur; th