利用迪杰斯特拉算法去最短路径.c
C语言迪杰斯特拉实现最短路径算法
C语言迪杰斯特拉实现最短路径算法迪杰斯特拉(Dijkstra)算法是一种用于在加权图中寻找从起点到终点的最短路径的算法。
它使用贪心算法的原理,每次选择权重最小的边进行扩展,直到找到终点或者无法扩展为止。
下面是C语言中迪杰斯特拉算法的实现。
```c#include <stdio.h>#include <stdbool.h>//定义图的最大节点数#define MAX_NODES 100//定义无穷大的距离#define INFINITY 9999//自定义图的结构体typedef structint distance[MAX_NODES][MAX_NODES]; // 节点间的距离int numNodes; // 节点数} Graph;//初始化图void initGraph(Graph* graph)int i, j;//设置所有节点之间的初始距离为无穷大for (i = 0; i < MAX_NODES; i++)for (j = 0; j < MAX_NODES; j++)graph->distance[i][j] = INFINITY;}}graph->numNodes = 0;//添加边到图void addEdge(Graph* graph, int source, int destination, int weight)graph->distance[source][destination] = weight;//打印最短路径void printShortestPath(int* parent, int node)if (parent[node] == -1)printf("%d ", node);return;}printShortestPath(parent, parent[node]);printf("%d ", node);//执行迪杰斯特拉算法void dijkstra(Graph* graph, int source, int destination) int i, j;//存储起点到各个节点的最短距离int dist[MAX_NODES];//存储当前节点的父节点int parent[MAX_NODES];//存储已访问的节点bool visited[MAX_NODES];//初始化所有节点的距离和父节点for (i = 0; i < graph->numNodes; i++)dist[i] = INFINITY;parent[i] = -1;visited[i] = false;}//设置起点的距离为0dist[source] = 0;//寻找最短路径for (i = 0; i < graph->numNodes - 1; i++)int minDist = INFINITY;int minNode = -1;//选择距离最小的节点作为当前节点for (j = 0; j < graph->numNodes; j++)if (!visited[j] && dist[j] < minDist)minDist = dist[j];minNode = j;}}//标记当前节点为已访问visited[minNode] = true;//更新最短距离和父节点for (j = 0; j < graph->numNodes; j++)if (!visited[j] && (dist[minNode] + graph->distance[minNode][j]) < dist[j])dist[j] = dist[minNode] + graph->distance[minNode][j];parent[j] = minNode;}}}//打印最短路径及距离printf("Shortest Path: ");printShortestPath(parent, destination);printf("\nShortest Distance: %d\n", dist[destination]); int maiGraph graph;int numNodes, numEdges, source, destination, weight;int i;//初始化图initGraph(&graph);//输入节点数和边数printf("Enter the number of nodes: ");scanf("%d", &numNodes);printf("Enter the number of edges: ");scanf("%d", &numEdges);graph.numNodes = numNodes;//输入边的信息for (i = 0; i < numEdges; i++)printf("Enter source, destination, and weight for edge %d: ", i + 1);scanf("%d %d %d", &source, &destination, &weight);addEdge(&graph, source, destination, weight);}//输入起点和终点printf("Enter the source node: ");scanf("%d", &source);printf("Enter the destination node: ");scanf("%d", &destination);//执行迪杰斯特拉算法dijkstra(&graph, source, destination);return 0;```上述代码中,我们首先定义了一个图的结构体,里面包括节点间的距离矩阵和节点数。
迪杰斯特拉最短路径算法
迪杰斯特拉最短路径算法迪杰斯特拉最短路径算法是一种求解从一点到其它所有点间的最短距离的经典算法。
这个算法的基本思想是通过一个当前最短距离的顶点集来求出从起点到其它所有顶点的最短路径。
迪杰斯特拉最短路径算法通常用于有权图中计算最短路径,即每条边都有一个权值。
算法思路迪杰斯特拉最短路径算法的核心思路在于维护一个记录起点到图中每个顶点的最短距离的数组dist[],同时维护一个标记数组mark[]用于标记每个顶点是否已经被访问过。
首先将起点标记为已访问,并将其到其它所有顶点的距离初始化为无穷大。
然后遍历起点所有的邻居节点,更新其邻居节点到起点的距离,并将邻居节点标记为已访问,接着从未标记为访问过的节点中选取距离最小的节点作为下一个处理节点,直到所有的节点都被访问。
算法的详细流程如下:1.从起点s开始,将起点距离初始化为0,其它点的距离初始化为无穷大。
2.标记起点为已访问。
3.对起点s的所有邻居节点进行松弛操作:对于起点到邻居节点v的距离dist[v],如果经过当前处理节点u的路径长度比原来的距离更短,则更新dist[v]和标记mark[v]。
4.从未标记为访问过的节点中选取距离最小的节点作为下一个处理节点。
5.对下一个处理节点进行松弛操作,以此类推,直到所有节点都被访问。
算法优化迪杰斯特拉最短路径算法存在一些优化算法,使得算法更加高效。
以下介绍几种优化算法:1.堆优化在每一次选取距离最小的未访问节点的过程中,可以使用堆优化算法将选取节点的时间复杂度从O(n)优化到O(logn)。
堆优化可以使用最小堆或者斐波那契堆。
2.早期退出如果当前处理的节点u到起点s的距离已经比dist[u]更大,那么就不需要继续处理u的邻居节点了。
这种情况下,可以提前结束算法,因为后面的处理节点不可能比u更优。
3.双向搜索通常来说,单向搜索是从起点向终点搜索,而双向搜索是从起点和终点同时搜索。
对于有向无环图,双向搜索可以大大降低时间复杂度,因为搜索过程中相遇的点一定是最短路径上的点。
迪杰斯特拉算法c语言
迪杰斯特拉算法c语言一、什么是迪杰斯特拉算法?迪杰斯特拉算法(Dijkstra algorithm)是一种用于解决图的最短路径问题的贪心算法。
它采用了广度优先搜索的策略,每次找到当前节点到其他所有节点中距离最短的一个节点,并将该节点加入到已访问的集合中,直到所有节点都被访问为止。
二、迪杰斯特拉算法的原理1. 初始化首先,我们需要对图进行初始化。
设定一个起点,并将该点距离源点的距离设置为0,其他点距离源点的距离设置为无穷大。
2. 找到最小距离接下来,我们需要从未访问过的节点中找到距离源点最近的一个节点。
这个过程可以通过建立一个优先队列来实现。
在每次找到最小值后,我们需要将该节点标记为已访问,并更新与该节点相邻的所有未访问过的节点的最小距离值。
3. 更新最短路径在更新与当前节点相邻的所有未访问过的节点之后,我们需要重新寻找未访问过的节点中距离源点最近的一个。
这个过程会不断重复直至所有节点都被访问过。
4. 输出结果当所有节点都被访问过之后,我们就可以得到从源点到其他所有节点的最短路径。
三、迪杰斯特拉算法的实现以下是一个使用C语言实现的简单示例代码:```c#define INF 1000000 // 定义无穷大int dist[MAX_VERTEX_NUM]; // 存储距离源点的距离int visited[MAX_VERTEX_NUM]; // 标记是否已访问过// 初始化图void init_graph(Graph G, int start) {for (int i = 0; i < G.vertex_num; i++) {dist[i] = INF;visited[i] = 0;}dist[start] = 0;}// 找到距离源点最近的节点int find_min(Graph G) {int min_dist = INF, min_index = -1;for (int i = 0; i < G.vertex_num; i++) {if (!visited[i] && dist[i] < min_dist) {min_dist = dist[i];min_index = i;}}return min_index;}// 更新与当前节点相邻的节点的最短距离值void update_dist(Graph G, int index) {for (EdgeNode* p = G.adj_list[index].first_edge; p != NULL; p= p->next_edge) {int v = p->adjvex;if (!visited[v] && dist[index] + p->weight < dist[v]) {dist[v] = dist[index] + p->weight;}}}// 迪杰斯特拉算法void dijkstra(Graph G, int start) {init_graph(G, start);for (int i = 0; i < G.vertex_num; i++) {int index = find_min(G);visited[index] = 1;update_dist(G, index);}}```四、迪杰斯特拉算法的应用迪杰斯特拉算法可以用于解决许多实际问题,如路由选择、网络优化等。
迪杰斯特拉求最短路径算法
通过使用迪杰斯特拉算法,我们可以找到这些最短 路径,从而帮助决策者做出更好的决策
在这些应用中,我们需要找到从一个地点到另一个 地点的最短路径,以便优化成本、时间和路线等
应用
Tarjan
Robert E. "A Class of Algorithms for Decomposing Disconnected Graphs". Journal of the ACM (JACM) 16.3 (1969): 430-447
在图论中,我们通常用节点表示地点,用边表 示两个地点之间的路径。每条边都有一个与之 相关的权重,表示从一个地点到另一个地点的 距离。迪杰斯特拉算法可以找到从源节点(出 发节点)到目标节点(目的地)的最短路径,即 使在图中存在负权重的边
算法步骤
算法步骤
初始化
01
将源节点的距离设置为0,将所有其他节点的距离
设置为正无穷。创建一个空的优先队列,并将源节
点放入队列
从优先队列中取出距离最小的节点
02
这个节点就是当前最短路径的起点
遍历从这个节点出发的所有边
03
对于每条边,如果通过这条边到达的节点的距离可
以通过当前节点更新(即新距离小于原距离),那么
就更新这个节点的距离,并将其加入优先队列
如果队列中仍有节点
04
回到步骤2。否则,算法结束
算法步骤
这个算法的时间复杂度是O((E+V)logV),其中 E是边的数量,V是节点的数量
这是因为每个节点和每条边都需要被处理和比 较,而这个过程是在一个优先队列中进行的,
需要O(logV)的时间复杂度
优点和缺点
优点和缺点
迪杰斯特拉算 法的优点在于 它可以在大多 数情况下找到 最短路径,而 且实现起来相 对简单
c语言实现迪杰斯特拉算法实例
c语言实现迪杰斯特拉算法实例========迪杰斯特拉算法是一种用于求解单源最短路径问题的算法,它使用Dijkstra 算法的思想,通过不断更新最短路径值,最终找到源节点到所有其他节点的最短路径。
下面是一个使用C语言实现迪杰斯特拉算法的实例。
一、算法概述------迪杰斯特拉算法的基本思想是:从源节点开始,不断更新与源节点相邻的节点之间的最短路径值,直到所有节点都被处理完毕。
算法的核心是使用一个最小堆来存储待处理的节点及其对应的距离值,每次从最小堆中取出距离值最小的节点,并更新与其相邻节点的距离值。
二、代码实现------以下是一个使用C语言实现迪杰斯特拉算法的示例代码:```c#include <stdio.h>#include <stdlib.h>#include <limits.h>#define MAX_NODES 100 // 最大节点数#define INF 0x3f3f3f3f // 无穷大值typedef struct Node {int id; // 节点编号int distance; // 到源节点的距离struct Node* nxt; // 指向下一个节点的指针(用于广度优先搜索)} Node;// 创建新节点Node* create_node(int id) {Node* node = (Node*)malloc(sizeof(Node));node->id = id;node->distance = INF;node->nxt = NULL;return node;}// 将节点添加到最小堆中(假设堆为head)void add_node_to_heap(Node** head, int* size, int distance) {Node* node = create_node(distance); // 创建新节点(*size)++; // 节点数加一(*head)->distance = distance; // 将新节点距离设置为最小值(*head)->nxt = node; // 将新节点添加到堆中while (*head->nxt != NULL && (*head->nxt)->distance < (*head)->distance) { // 调整堆中距离值最小节点的位置Node* temp = *head->nxt; // 保存当前距离最小的节点(*head)->nxt = (*head->nxt)->nxt; // 将当前节点的下一个节点向前移动一位(退出循环)free(temp); // 释放当前节点的内存空间(释放内存)}}// 从最小堆中取出距离值最小的节点(返回值为距离值)int extract_min(Node** head, int* size) {Node* temp = *head; // 保存当前距离最小的节点(用于后续更新)int min_distance = temp->distance; // 当前最小距离值(用于后续更新)Node** p = *head; // 指向当前距离最小的节点的指针(用于后续更新)while (p->nxt != NULL && p->distance > min_distance) { // 从堆中取出距离值最小的节点,并更新指针和距离值Node* next_node = p->nxt; // 保存下一个节点指针(用于广度优先搜索)*p = p->nxt->nxt; // 将当前节点的下一个节点向前移动一位(退出循环)p->distance = min_distance; // 将当前节点的距离值更新为当前最小值free(next_node); // 释放下一个节点的内存空间(释放内存)}*head = p->nxt; // 将当前节点的下一个节点设置为堆头指针(进入下一轮循环)*size--; // 删除已处理节点数减一(返回最小距离值)return min_distance; // 返回最小距离值(作为结果返回)}// 迪杰斯特拉算法主函数(源代码)void dijkstra(int nodes, int start_node, Node** nodes_list) {int size = nodes; // 初始化节点数和距离数组大小为0(初始化)Node* heap = (Node*)malloc(sizeof(Node) * size); // 创建最小堆(初始化)for (int i = 0; i < size; i++) { // 将所有节点添加到堆中,并设置其距离值为无穷大(进入主循环)add_。
c语言最短路径搜寻算法
c语言最短路径搜寻算法
C 语言最短路径搜寻算法常用于在网图中寻找两点之间的最短路径,其中网图的最短路径分为单源最短路径和多源最短路径。
以下是两种常见的最短路径搜寻算法:- Dijkstra 算法:从一个起始点出发,到达一个终点,通过对路径权值的累加,找到最短路径。
- Floyd 算法:对于网中的任意两个顶点来说,之间的最短路径不外乎有两种情况。
一种是直接从一个顶点到另一个顶点的边的权值;另一种是先经过若干个顶点,最终达到另一个顶点,期间经过的边的权值和。
这两种算法都可以用 C 语言实现,你可以根据具体需求选择合适的算法。
若你想了解更多关于最短路径搜寻算法的内容,可以继续向我提问。
最短路径——dijkstra算法代码(c语言)
最短路径——dijkstra算法代码(c语⾔)最短路径问题看了王道的视频,感觉云⾥雾⾥的,所以写这个博客来加深理解。
(希望能在12点以前写完)()⼀、总体思想1.初始化三个辅助数组s[],dist[],path[]s[]:这个数组⽤来标记结点的访问与否,如果该结点被访问,则为1,如果该结点还没有访问,则为0;dist[]:这个数组⽤来记录当前从v到各个顶点的最短路径长度,算法的核⼼思想就是通过不断修改这个表实现; path[]:这个数组⽤来存放最短路径;2.遍历图,修改上⾯的各项数组,每次只找最短路径,直到遍历结束⼆、代码实现1void dijkstra(Graph G, int v)2 {3int s[G.vexnum];4int dist[G.vexnum];5int path[G.vexnum];6for(int i = 0; i < G.vexnum; i++)7 {8 s[i] = 0;9 dist[i] = G.edge[v][i];10if(G.edge[v][i] == max || G.edge[v][i] == 0)11 {12 path[i] = -1;13 }14else15 {16 path[i] = v;17 }18 s[v] = 1;19 }2021for(int i = 0; i < G.vexnum; i++)22 {23int min = max;24int u;25for(int j = 0; j < G.vexnum; j++)26 {27if(s[j] != 1 && dist[j] < min)28 {29 min = dist[j];30 u = j;31 }32 }33 s[u] = 1;34for(int j = 0; j < G.vexnum; j++)35 {36if(s[j] != 1 && dist[j] > dist[u] + G.edge[u][j])37 {38 dist[j] = dist[u] + G.edge[u][j];39 path[j] = u;40 }41 }42 }43 }三、代码解释先⾃⼰定义⼀个⽆穷⼤的值max#define max infdijkstra算法传⼊的两个参为图Graph G;起点结点 int v;⾸先我们需要三个辅助数组1int s[G.vexnum];//记录结点时是否被访问过,访问过为1,没有访问过为02int dist[G.vexnum];//记录当前的从v结点开始到各个结点的最短路径长度3int path[G.vexnum];//记录最短路径,存放的是该结点的上⼀个为最短路径的前驱结点初始化三个数组1for(int i = 0; i < G.vexnum; i++)2 {3 s[i] = 0;//⽬前每个结点均未被访问过,设为04 dist[i] = G.edge[v][i];//dist[]数组记录每个从v结点开到其他i结点边的长度(权值)5if(G.edge[v][i] == max || G.edge[v][i] == 0)6 {7 path[i] = -1;8 }//如果v到i不存在路径或者i就是v结点时,将path[i]设为-1,意为⽬前v结点不存在路径到i9else10 {11 path[i] = v;12 }//反之,若v到i存在路径,则v就是i的前驱结点,将path[i] = v13 s[v] = 1;//从遍历起点v开始,即已经访问过顶点s[v]=114 }开始遍历数组并且每次修改辅助数组以记录⽬前的情况,直⾄遍历结束1for(int i = 0; i < G.vexnum; i++)2 {3int min = max;//声明⼀个min = max⽤来每次记录这次遍历找到的最短路径的长度(权值)4int u;//声明u来记录这次历找到的最短路径的结点5for(int j = 0; j < G.vexnum; j++)//开始遍历找⽬前的最短路径6 {7if(s[j] != 1 && dist[j] < min)8 {9 min = dist[j];10 u = j;11 }//找出v到结点j的最短路径,并且记录下最短路径的结点u = j12 }13 s[u] = 1;//找到结点u,即已访问过u,s[u] = 114for(int j = 0; j < G.vexnum; j++)//开始遍历修改辅助数组的值15 {16if(s[j] != 1 && dist[j] > dist[u] + G.edge[u][j])17 {18 dist[j] = dist[u] + G.edge[u][j];19 path[j] = u;20 }//如果v→j的路径⽐v →u→j长,那么修改dist[j]的值为 dist[u] + G.edge[u][j],并且修改j的前驱结点为path[j] = u21 }22 }遍历结束后,数组dist[]就是存放了起点v开始到各个顶点的最短路径长度最短路径包含的结点就在path数组中例如我们得到如下的path[]数组1 path[0] = -1;//0到⾃⼰⽆前驱结点2 path[1] = 0;//1的前驱为结点0,0⽆前驱结点,即最短路径为0 →13 path[2] = 1;//2的前驱结为点1,1的前驱结点0,0⽆前驱结点,即最短路径为0 →1 →24 path[3] = 0;//3的前驱为结点0,0⽆前驱结点,即最短路径为0 →35 path[4] = 2;//4的前驱结为点2,2的前驱结为点1,1的前驱结点0,0⽆前驱结点,即最短路径为0 →1 →2 →4 dijkstra对于存在负权值的图不适⽤,明天再更新Floyd算法叭。
迪杰斯特拉算法计算最短路径
利用Dijkstra算法计算最短路径摘要福格环游地球问题是一个十分典型的最短路径求解问题,题设给出了当时世界上主要交通网络图及交通通畅的城市之间来往所需时长,并限定了福格的出行方向(福格选择的是往东走),给出起止地点后要求找出福格环游世界天数最短的最佳路径。
我们认为,这个问题的实质在于最短路径的求解和优化。
我们对比图论中的多种最短路径算法,决定利用Dijkstra算法解决这个问题。
由于Dijkstra算法要求输入图G的关联矩阵,且图G为二维赋权图,而题中给出的地图可看成是三维环状地图,因此,我们对题设地图做相关处理,将其从起点处“切断”并展开为二维图,然后根据此图建立关联矩阵。
同时,我们考虑到最短路径可能会与切断线有交点,在切断线以西找出若干地点一分为二,修改关联矩阵。
对于题目中缺失的两处数据,本文将以当时的交通数据为基础,经过合理的数据处理,结合Google Earth测距软件与题目数据的合理类比,补充缺失数据,完成关联矩阵。
得到关联矩阵后,我们分别以伦敦、纽约和上海作为起点,调整关联矩阵起点和终点,用matlab编程进行求解得到最短环游时间和最短路径,进而判断出所选择的路径是否能让他赢得赌注。
根据我们的求解结果,在这三个城市,福格均能在80天内环游地球,赢得赌注。
本文进一步对此种算法的优缺点、灵敏度与推广性进行了分析,同时初步提出了两种优化方法。
关键词:最短路径算法 dijkstra算法算法优化一、问题重述儒勒•凡尔纳的著名小说《环游世界80天》中,英国绅士福格在伦敦与人打赌能够在80天内环游世界,这在当时的1872年是一个了不起的壮举。
当时最快的旅行方式是火车和轮船,然而世界上大部分地区还是靠马车、大象、驴子或者步行来旅行。
下面是一个从伦敦环游世界不同路线的交通网络图,福格选择的是往东走,每段路线所需要的天数显示在图上(见附录一),旅行的时间基于1872年能采用的旅行方式以及距离。
我们将解决以下问题:1.我们将设计一个算法为福格选择一条最佳路径,即环游世界天数最短,并判断所选择的路径是否能让他赢得赌注。
dijkstra算法最短路径
《求解最短路径:应用迪杰斯特拉算法》一、介绍Dijkstra算法的概念和基本原理Dijkstra算法是一种用于解决最短路径问题的算法,它由荷兰计算机科学家Edsger Dijkstra在1959年发明,用于求解从源点到其他所有结点的最短路径。
它的基本原理是:在一张图中,从源点到每一个结点的最短路径是从源点开始,经过最少的边到达每一个结点的路径。
Dijkstra算法的实现过程中,首先要建立一个有向图,该图由顶点和边组成,每条边都有一个权值,表示从一个顶点到另一个顶点的距离。
然后,从源点开始,每次选择最小权值的边,继续查找下一个顶点,直到找到终点。
最后,将所有路径之和求出,即为源点到目标点的最短路径。
举例来说,假如有一张有向图,其中有A,B,C,D四个结点,以及AB,AC,BD,CD四条边,其中AB,AC,BD边的权值分别为2,3,1,CD边的权值为4。
如果要求求出从A到D的最短路径,则可以使用Dijkstra算法,首先从A出发,选择权值最小的边,即BD,则A-B-D的路径长度为3,接着从B出发,选择权值最小的边,即CD,则A-B-D-C的路径长度为7,因此,从A到D的最短路径为A-B-D,路径长度为3。
Dijkstra算法的优点是算法简单,实现方便,时间复杂度低,它可以用于解决路径规划,车辆调度,网络路由等问题,同时,它也可以用于解决复杂的最短路径问题。
因此,Dijkstra算法在计算机科学中有着重要的应用价值。
二、讨论Dijkstra算法的应用及其优势Dijkstra算法是一种用于解决最短路径问题的算法,它的应用和优势非常广泛。
首先,Dijkstra算法可以用于解决交通路网中的最短路径问题。
例如,在一个城市的交通路网中,如果一个乘客要从一个地方到另一个地方,那么他可以使用Dijkstra算法来查找最短的路径。
这样可以节省乘客的时间和金钱,也可以减少拥堵。
此外,Dijkstra算法还可以用于解决计算机网络中的最短路径问题。
迪杰斯特拉算法最短路径
迪杰斯特拉算法最短路径迪杰斯特拉算法(Dijkstra's algorithm)是一种用于计算图中最短路径的算法。
它是由荷兰计算机科学家艾兹赫尔·迪杰斯特拉(Edsger Wybe Dijkstra)于1956年提出的,并且被广泛应用于网络路由和地图导航等领域。
迪杰斯特拉算法可以解决的问题是,给定一个带有非负权重的有向图和一个起始节点,找出从起始节点到其他所有节点的最短路径。
该算法采用了贪心的策略,即每次选择当前离起始节点最近的节点进行扩展,直到扩展到目标节点为止。
算法的具体步骤如下:1.初始化:将起始节点的距离设置为0,其他节点的距离设置为无穷大。
2.创建一个优先队列(通常是最小堆),用于存储待扩展的节点。
将起始节点加入队列。
3.循环以下步骤直到队列为空:-从队列中取出距离起始节点最近的节点,记为当前节点。
-如果当前节点已被访问过,则跳过该节点。
-更新与当前节点相邻节点的距离。
如果经过当前节点到达某个相邻节点的路径比之前计算的路径短,则更新这个节点的距离。
-将未访问过的相邻节点加入队列。
4.循环结束后,所有节点的最短路径已被计算出。
迪杰斯特拉算法的核心思想是不断扩展距离起始节点最近的节点,通过更新节点的距离,逐步获取最短路径。
算法的时间复杂度为O(V^2),其中V是图中的节点数量。
这是因为每次循环需要查找距离起始节点最近的节点,而在最坏情况下,这个操作需要遍历所有节点。
以下是一个简单的例子来说明迪杰斯特拉算法的使用:假设有一个有向图,如下所示:```A ->B (1)A -> C (4)B ->C (2)B -> D (5)C ->D (1)C -> E (3)D ->E (4)```起始节点为A,我们希望找到到达其他节点的最短路径。
首先,初始化距离:A到A的距离为0,A到B/C/D/E的距离均为无穷大。
然后,将A加入优先队列。
从队列中取出A,更新A的邻居节点的距离。
迪杰斯特拉算法求单源最短路径
迪杰斯特拉算法是一种用于求解单源最短路径的经典算法,它被广泛应用于网络路由、电信领域以及各种其他实际问题中。
本文将从以下几个方面详细介绍迪杰斯特拉算法的原理、实现以及应用,以帮助读者深入理解并掌握该算法。
一、迪杰斯特拉算法的原理迪杰斯特拉算法的核心思想是通过逐步确定从起点到其他顶点的最短路径来求解单源最短路径问题。
其具体原理包括以下几个步骤:1. 初始化:将起点到所有其他顶点的距离初始化为无穷大,起点到自身的距离为0,并建立一个空的集合S来存放已确定最短路径的顶点。
2. 选择最近顶点:从未确定最短路径的顶点中选择距离起点最近的顶点u加入集合S。
3. 更新距离:对于顶点集合V-S中的每个顶点v,如果通过顶点u可以找到一条比当前最短路径更短的路径,则更新起点到顶点v的距离。
4. 重复步骤2和步骤3,直到集合S包含所有顶点。
通过上述步骤,迪杰斯特拉算法可以求解出起点到图中所有其他顶点的最短路径。
二、迪杰斯特拉算法的实现迪杰斯特拉算法可以通过多种数据结构来实现,其中最常见的是使用优先队列来存储未确定最短路径的顶点,并通过松弛操作来更新顶点的距离。
下面将介绍一种基于优先队列的迪杰斯特拉算法实现方法:1. 初始化距离数组dist[],其中dist[i]表示起点到顶点i的最短距离,将所有顶点初始化为无穷大,起点初始化为0。
2. 将起点加入优先队列,并将其距离更新为0。
3. 循环执行以下步骤直到优先队列为空:(1)从优先队列中取出距离起点最近的顶点u。
(2)遍历顶点u的所有邻接顶点v,对于每个邻接顶点v,如果通过顶点u可以找到一条更短的路径,则更新顶点v的距离,并将其加入优先队列。
通过上述实现,我们可以得到起点到所有其他顶点的最短路径。
三、迪杰斯特拉算法的应用迪杰斯特拉算法在实际应用中有着广泛的应用场景,其中最典型的应用包括网络路由、电信领域以及地图路径规划等。
1. 网络路由:在计算机网络中,迪杰斯特拉算法被用于寻找最短路径,以确保数据包以最短的路径到达目的地,提高网络传输效率。
迪杰斯特拉算法求最短路径图解
迪杰斯特拉算法求最短路径图解
迪杰斯特拉算法是在用运筹学中解决路径搜索问题时候非常有用的一种算法。
它适用于求解从一个点到其他所有点的最短路径。
这种算法主要应用于交通网络,求解旅游问题,处理穿越桥梁或隧道的情况等等。
迪杰斯特拉算法的含义就是“最短路径”。
这种算法比较常见的一种,因为它
可以用于解决上述类型的问题,也能够给出即时的答案。
需要说明的是,运用迪杰斯特拉算法求解最短路径,需要满足一定的条件:必须满足图的邻接关系,并且确定用于求最短路径的起点和终点。
迪杰斯特拉的步骤可以分为四步:
第一步:先从所有节点中选择一个起始节点,找出该节点与其他节点之间的最
短路径;
第二步:选择一个未被访问的节点,计算从起始节点到该节点的最短路径长度;
第三步:在剩余节点中重复步骤二直至起始节点与所有节点均被访问;
第四步:当所有节点都被访问后,根据记录的信息,选择起始节点通往其他节
点的最短路径。
一旦经过这四步完成了最短路径的搜索,就可以使用迪杰斯特拉算法解决最短
路径问题了。
这种算法的特点在于它的有效性,准确性和便捷性,可以找出最短路径的最优解来解决问题,并且很容易实施。
解决最短路径问题时,使用该算法的一大优势在于可以考虑到不同的费用,这也就意味着可以计算具有很高效率的最短路径。
离散数学中的图的最短路径与迪杰斯特拉算法
在离散数学中,图论是一个重要的研究领域,涉及到许多与图有关的概念和算法。
其中,最短路径和迪杰斯特拉算法被广泛应用于图中节点之间最短路径的计算与查找。
首先,我们来了解一下最短路径的概念。
在一个有向或无向图中,最短路径是指从起始节点到目标节点的路径中,具有最小权重的路径。
权重可以表示为两个节点之间的距离、成本或代价等。
在现实生活中,最短路径问题可以应用到许多场景中,比如寻找两个城市之间的最短路线或者确定网络中两台计算机之间的最短连接。
要计算图中的最短路径,其中一种经典的算法是迪杰斯特拉算法。
迪杰斯特拉算法是一种贪心算法,通过逐步更新节点的距离值来找到最短路径。
它的基本思想是从起始节点开始,首先将起始节点的距离值设置为0,然后将所有其他节点的距离值设置为无穷大。
接下来,算法根据每条边的权重更新节点的距离值,直到找到目标节点或者遍历完所有节点为止。
具体来说,迪杰斯特拉算法可以分为以下几个步骤:1.初始化:将起始节点的距离值设为0,将其他节点的距离值设为无穷大。
2.遍历:从起始节点开始,逐一考察与当前节点相邻的节点。
3.更新距离:对于每一个相邻节点,计算通过当前节点到达该节点的距离,并将其与该节点存储的当前最短距离进行比较。
如果通过当前节点的路径更短,就更新该节点的最短距离值。
4.标记节点:在遍历的过程中,通过节点之间的最短路径更新,我们可以逐渐标记节点为“已访问”,确保每一个节点的最短路径都已计算。
5.终止条件:当遍历完成或者找到目标节点时,算法终止。
迪杰斯特拉算法的时间复杂度为O(N^2),其中N是图中的节点数量。
尽管在大规模图中可能会出现效率问题,但对于中小规模的图,该算法具有较高的实用价值。
总结来说,离散数学中的图的最短路径与迪杰斯特拉算法密不可分。
通过迪杰斯特拉算法,我们可以在图中找到从起始节点到目标节点的最短路径。
该方法的基本思想是贪心的,通过逐步更新节点的距离值,从而逐渐找到最短路径。
无论是用于寻找城市间最短路线还是网络中最短连接,这个算法都具有广泛的应用前景。
迪杰斯特拉算法(戴克斯特拉算法)(Dijkstra算法)-贪心、最短路径问题
迪杰斯特拉算法(戴克斯特拉算法)(Dijkstra算法)-贪⼼、最短路径问题戴克斯特拉算法:(英语:Dijkstra's algorithm,⼜译迪杰斯特拉算法)由荷兰计算机科学家在1956年提出。
戴克斯特拉算法使⽤了解决赋权的问题。
如图为⼀个有权⽆向图,起始点1到终点5,求最短路径lowcost数组存储下标点到起始点的最短距离,mst数组标记该点是否已标记,如下图,遍历graph数组找出初始点(点1)与个点之间的距离存⼊lowcost(距离<lowcost存⼊),*为⽆穷⼤遍历lowcost数组,找出最⼩值并且没有被标记过(mst != 0),找出的最⼩值的点标记(mst = 0),sum=4遍历graph数组,存⼊lowcost中(注意:8到2的距离+sum<lowcost[8],所以lowcost[8]=graph[2][8]+sum)注意:mst[1]是等于0的,下⾯都是0遍历lowcost数组,找出最⼩值,sum=7以下都依次类推...输⼊:9 14 1 5 1 2 41 8 82 8 32 3 88 9 18 7 63 9 29 7 63 4 73 6 47 6 24 6 144 5 96 5 10输出:24代码:#include <iostream>#include <bits/stdc++.h>using namespace std;#define MAX 100#define MAXCOST 0x7fffffff //int型最⼤值void prim(int graph[][MAX],int n,int start,int end){int lowcost[MAX];int mst[MAX];int sum=0;for(int i=1;i<=n;i++)//将与各点与起始点的距离存⼊lowcost中{lowcost[i]=graph[start][i];mst[i]=1;}mst[start]=0; //起始点被标记for(int i=1;i<=n;i++){if(mst[end]==0)//终点被标记结束{cout<<sum;break;}int min=MAXCOST;int minid=0;for(int j=1;j<=n;j++)//遍历lowcost数组,找最⼩值{if(lowcost[j]<min && mst[j]!=0){min=lowcost[j]; //最⼩值minid=j; //最⼩值下标}}//cout<<"V"<<mst[minid]<<"-V"<<minid<<"="<<min<<endl;sum=min;//cout<<sum<<endl;mst[minid]=0; //最⼩值下标点被标记for(int j=1;j<=n;j++)//找最⼩值点与各点的距离{if(graph[minid][j]==MAXCOST)//如果此点与最⼩值点没有联系(距离为最⼤值)则lowcost不变,跳过{continue;}else if(graph[minid][j]+sum<lowcost[j] && mst[j]!=0)//此点与最⼩点有联系,并且+sum<lowcost 并且此点没有被标记,则赋值给lowcost {lowcost[j]=graph[minid][j]+sum;}}}}int main(){int n,m;int start,end;int graph[MAX][MAX];cin>>n>>m>>start>>end;//初始化图Gfor(int i=1;i<=n;i++){for(int j=1;j<=n;j++){graph[i][j]=MAXCOST;}}//构建图Gfor(int k=1;k<=m;k++){int i,j,cost;cin>>i>>j>>cost;graph[i][j]=cost;graph[j][i]=cost;}prim(graph,n,start,end); return0;}。
迪杰斯特拉算法c语言从某个源点到其余各顶点的最短路径
迪杰斯特拉算法c语言从某个源点到其余各顶点的最短路径1. 引言1.1 概述迪杰斯特拉算法是一种用于解决带权有向图中单源最短路径问题的经典算法。
该算法通过不断更新顶点之间的距离估计值,找到从给定源点到达其他所有顶点的最短路径。
在实际应用中,迪杰斯特拉算法被广泛应用于路由选择、通信网络以及交通运输等领域。
1.2 文章结构本文将围绕迪杰斯特拉算法展开讨论,并以C语言作为实现工具。
我们首先介绍了迪杰斯特拉算法的概述,包括其原理、应用场景和优势。
接着详细介绍了如何使用C语言来实现迪杰斯特拉算法,并分析了代码的数据结构设计、算法实现步骤以及示例代码解析。
随后,我们进行了示例测试与结果分析,展示了如何根据创建的图和设定的源点执行迪杰斯特拉算法并求解最短路径。
最后,我们对整个文章进行总结讨论,并展望了迪杰斯特拉算法在未来的应用前景,并提出硬件资源限制下的改进策略。
1.3 目的本文旨在深入介绍迪杰斯特拉算法,并通过C语言代码实现的方式,帮助读者理解和掌握该算法的原理和实际应用。
通过对算法原理、数据结构设计以及示例测试与结果分析的详细讲解,我们旨在提供一个全面且易于理解的指导,使读者能够更好地应用迪杰斯特拉算法解决自己所面临的问题,并为进一步优化和改进迪杰斯特拉算法提供思路和启示。
2. 迪杰斯特拉算法概述2.1 算法原理迪杰斯特拉算法是一种用于解决带权有向图中单源最短路径问题的经典算法。
其基本思想是通过不断更新到达各顶点的最短路径长度,逐步确定源点到其他所有顶点的最短路径。
具体实现过程如下:1. 创建两个集合S和V-S,其中S表示已确定最短路径的顶点集合,V-S表示尚未确定最短路径的顶点集合。
2. 初始化源点到所有其他顶点的距离为无穷大,而源点到自身的距离为0。
3. 选择一个还未确定最短路径的顶点v,并且使得源点到v的距离为当前已知的最小值。
4. 标记该顶点v为已确定最短路径。
5. 更新与v邻接但在V-S中的顶点u的最短路径长度:若经过v后,从源点到u比之前计算得到的距离更短,则更新这个距离值。
邻接表实现迪杰斯特拉算法求最短路径-概述说明以及解释
邻接表实现迪杰斯特拉算法求最短路径-概述说明以及解释1.引言1.1 概述在图论中,寻找两个不同顶点之间的最短路径是一个常见的问题。
迪杰斯特拉算法是一种经典的解决最短路径问题的算法之一。
该算法采用贪心的策略,通过不断地更新起始顶点到其他顶点的最短距离,在最终找到最短路径的过程中。
邻接表是一种常用的图表示方法,将图的结构信息存储在一个表中,可以方便地查找与每个顶点相邻的顶点。
将迪杰斯特拉算法与邻接表结合起来,可以更高效地求解最短路径问题。
本文将介绍迪杰斯特拉算法的基本概念,并详细讨论如何通过邻接表实现迪杰斯特拉算法来求解最短路径问题。
通过对算法步骤的分析和实例的展示,读者将更加深入地理解迪杰斯特拉算法的原理和实现方式,以及邻接表在算法中的重要作用。
json"1.2 文章结构": {"本文主要分为引言、正文和结论三个部分。
引言部分将对文章进行整体概述,包括迪杰斯特拉算法的基本原理和应用背景。
正文部分将详细介绍迪杰斯特拉算法的原理和邻接表的概念及构建方法,同时介绍如何利用邻接表实现迪杰斯特拉算法求解最短路径问题。
结论部分将总结迪杰斯特拉算法在最短路径问题中的应用情况,探讨邻接表实现迪杰斯特拉算法的优势,并展望未来可能的研究方向。
"}1.3 目的本文的目的是介绍如何利用邻接表实现迪杰斯特拉算法求解最短路径问题。
通过深入讨论迪杰斯特拉算法的原理和邻接表的构建方式,帮助读者理解算法的具体实现过程。
此外,我们还将分析邻接表实现迪杰斯特拉算法的优势和应用场景,以及展望未来在这一领域的研究方向。
通过本文的阐述,读者将能够更好地掌握迪杰斯特拉算法在最短路径问题中的应用,并在实际工程中灵活运用该算法解决复杂的路径规划问题。
2.正文2.1 迪杰斯特拉算法简介迪杰斯特拉算法是一种用来求解最短路径的经典算法,也被称为单源最短路径算法。
该算法由荷兰计算机科学家艾兹格·迪杰斯特拉在1956年提出。
c语言最短路径的迪杰斯特拉算法
c语言最短路径的迪杰斯特拉算法Dijkstra的算法是一种用于查找图中两个节点之间最短路径的算法。
这个算法可以应用于有向图和无向图,但是它假设所有的边都有正权值,并且不包含负权值的边。
以下是一个简单的C语言实现:c复制代码#include<stdio.h>#define INF 99999#define V 5 // 顶点的数量void printSolution(int dist[]);void dijkstra(int graph[V][V], int src);int main() {int graph[V][V] = { { 0, 4, 0, 0, 0 }, { 4, 0, 8, 11, 7 },{ 0, 8, 0, 10, 4 },{ 0, 11, 10, 0, 2 },{ 0, 7, 4, 2, 0 } };dijkstra(graph, 0);return0;}void dijkstra(int graph[V][V], int src) { int dist[V];int i, j;for (i = 0; i < V; i++) {dist[i] = INF;}dist[src] = 0;for (i = 0; i < V - 1; i++) {int u = -1;for (j = 0; j < V; j++) {if (dist[j] > INF) continue;if (u == -1 || dist[j] < dist[u]) u = j;}if (u == -1) return;for (j = 0; j < V; j++) {if (graph[u][j] && dist[u] != INF && dist[u] + graph[u][j] < dist[j]) {dist[j] = dist[u] + graph[u][j];}}}printSolution(dist);}void printSolution(int dist[]) {printf("Vertex Distance from Source\n"); for (int i = 0; i < V; i++) {printf("%d \t\t %d\n", i, dist[i]);}}这个代码实现了一个基本的Dijkstra算法。
迪杰斯特拉算法最短路径求解
迪杰斯特拉算法最短路径求解
摘要:
一、迪杰斯特拉算法简介
二、最短路径求解的问题描述
三、迪杰斯特拉算法的核心思想
四、迪杰斯特拉算法的基本步骤
五、迪杰斯特拉算法的应用领域
六、结论
正文:
迪杰斯特拉算法最短路径求解是一种在图中寻找从源点到其他所有点的最短路径的算法。
该算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。
它主要解决的是有向图中最短路径问题。
最短路径求解的问题描述如下:给定一个无向图G(V, E),其中V 表示顶点集合,E 表示边集合。
要求从顶点s 到其他所有顶点的最短路径。
迪杰斯特拉算法的核心思想是以起始点为中心向外层层扩展,直到扩展到终点为止。
算法采用了贪心的思想,每次都查找与该点距离最近的点。
迪杰斯特拉算法的基本步骤如下:
1.初始化:将源点s 的距离设为0,其余顶点的距离设为无限大(表示还未到达)。
2.迭代:每次找出距离起点最近的未访问的顶点,并标记它已经被访问。
然后更新其他顶点的距离,即如果从起点经过这个被访问的顶点可以更新它们
的距离,则更新它们的距离。
3.重复步骤2,直到所有顶点都被访问过。
迪杰斯特拉算法在计算机科学、运筹学、信息检索等领域具有广泛的应用。
它可以用来求解最短路径问题,如在物流、导航、网络通信等领域。
此外,该算法还可用于求解其他问题,如最小生成树、最大流最小割等。
总之,迪杰斯特拉算法是一种求解最短路径问题的经典算法,具有广泛的应用价值。
迪杰斯特拉算法c语言从某个源点到其余各顶点的最短路径 -回复
迪杰斯特拉算法c语言从某个源点到其余各顶点的最短路径-回复迪杰斯特拉算法(Dijkstra's algorithm)是求解图中从某个源点到其余各顶点的最短路径的经典算法。
本文将通过一步一步的回答,详细解释迪杰斯特拉算法在C语言中的具体实现。
文章将包括算法原理、伪代码、关键函数实现以及一个简单的示例。
一、算法原理迪杰斯特拉算法是一种贪心算法,它通过逐步扩展最短路径的方式来找到源点到其他顶点的最短路径。
具体的步骤如下:1. 创建一个空的距离表,用于记录源点到各个顶点的最短路径,初始时将源点到自身的距离设置为0,其他顶点的距离设置为无穷大。
2. 选择一个距离表中距离最小的顶点,标记该顶点为已访问。
3. 对于已访问的顶点,更新其相邻顶点的距离,如果通过当前顶点的距离比原距离小,则更新距离值。
4. 重复步骤2和步骤3,直到所有顶点都被访问过或者没有可达的顶点。
二、伪代码为了更好地理解算法的实现,下面是使用伪代码描述的迪杰斯特拉算法:1. 创建一个距离表,用于记录源点到各个顶点的最短路径距离。
2. 将源点到自身的距离设置为0,其他顶点的距离设置为无穷大。
3. 创建一个标记表,用于标记已访问的顶点。
4. 创建一个优先队列(最小堆),用于选择下一个要访问的顶点。
5. 将源点入队列。
6. 当队列不为空时,执行以下操作:6.1. 选择队列中距离最小的顶点,将其出队。
6.2. 如果该顶点已经被访问过,则跳过该顶点。
6.3. 标记该顶点为已访问。
6.4. 对于该顶点的所有邻接顶点,计算通过当前顶点到达邻接顶点的距离,如果距离比原来的距离小,则更新距离表中的值。
6.5. 对于未访问过的邻接顶点,将其入队列。
7. 输出距离表中源点到各个顶点的最短路径距离。
三、关键函数实现下面是使用C语言实现迪杰斯特拉算法的关键函数。
c用于记录源点到各个顶点的最短路径距离int distance[MAX_VERTICES];用于标记已访问的顶点bool visited[MAX_VERTICES];void Dijkstra(int graph[MAX_VERTICES][MAX_VERTICES], int source) {初始化距离表和标记表for (int i = 0; i < MAX_VERTICES; i++) {distance[i] = INT_MAX;visited[i] = false;}将源点到自身的距离设置为0distance[source] = 0;循环遍历每个顶点for (int count = 0; count < MAX_VERTICES; count++) {int u = -1; 用于记录下一个要访问的顶点int minDistance = INT_MAX;选择距离最小的未访问顶点作为下一个要访问的顶点for (int i = 0; i < MAX_VERTICES; i++) {if (!visited[i] && distance[i] < minDistance) {minDistance = distance[i];u = i;}}if (u == -1) {没有可达的顶点break;}visited[u] = true; 标记该顶点为已访问更新通过顶点u到达其他邻接顶点的距离for (int v = 0; v < MAX_VERTICES; v++) {if (!visited[v] && graph[u][v] != INT_MAX && distance[u] + graph[u][v] < distance[v]) {distance[v] = distance[u] + graph[u][v];}}}}四、示例为了演示迪杰斯特拉算法的使用,我们使用以下图结构作为示例:int graph[MAX_VERTICES][MAX_VERTICES] = {{0, 4, 2, INT_MAX, INT_MAX},{INT_MAX, 0, 1, 5, INT_MAX},{INT_MAX, INT_MAX, 0, INT_MAX, 3},{INT_MAX, INT_MAX, INT_MAX, 0, 1},{INT_MAX, INT_MAX, INT_MAX, INT_MAX, 0}};int source = 0;Dijkstra(graph, source);上述图结构表示一个有5个顶点的有向带权图,带权值表示了从一个顶点到另一个顶点的距离。
c语言迪杰斯特拉算法
c语言迪杰斯特拉算法C语言迪杰斯特拉算法概述迪杰斯特拉算法是一种用于计算带权有向图中的最短路径的算法。
该算法以一个起始节点开始,逐步扩展到与它相邻的节点,直到找到目标节点或者遍历完所有节点。
迪杰斯特拉算法使用了贪心策略,每次选择当前最短路径来扩展。
本文将介绍如何使用C语言实现迪杰斯特拉算法,并提供代码示例和详细解释。
实现步骤1. 初始化图首先需要定义一个图结构体,包含节点数量、边数量、起始节点和边的信息。
在初始化时,需要为每个节点设置一个距离值和一个标记值,距离值表示从起始节点到该节点的最短距离,标记值表示该节点是否已经被访问过。
typedef struct{int nodeNum; // 节点数量int edgeNum; // 边数量int startNode; // 起始节点int **edges; // 图的边信息}Graph;void initGraph(Graph *graph){int i, j;printf("请输入图中包含的节点数:");scanf("%d", &graph->nodeNum);printf("请输入图中包含的边数:");scanf("%d", &graph->edgeNum);printf("请输入起始节点:");scanf("%d", &graph->startNode);graph->edges = (int **)malloc(sizeof(int *) * graph->nodeNum);for(i = 0; i < graph->nodeNum; i++){graph->edges[i] = (int *)malloc(sizeof(int) * graph->nodeNum);for(j = 0; j < graph->nodeNum; j++){if(i == j){graph->edges[i][j] = 0;}else{graph->edges[i][j] = INT_MAX;}}}}2. 添加边信息接下来需要添加边的信息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void init();
int minD();
void output_step();
void output_path();
void Push(int);
int Pop();
void main()
{
int t,I;
if ( (S[i] == NOTVISITED) && D[i] < minimum )
{
minimum = D[i];
t = i;
}
return t;
}
/* 显示目前的D数组与P数组状况 */
void output_step()
{
int i;
A[i][j] = weight; /*读取i节点到j节点的权weight */
fclose(fptr);
printf("Enter source node : ");
scanf("%d",&source);
printf("Enter sink node : ");
/*判断是否起始顶点等于终点或无路径至终点*/
if ( (sink == source) || (D[sink] =ode %d has no Path to Node %d",source,sink);
return;
}
/* file name: sh_path.c */
/*利用迪杰斯特拉算法去最短路径*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define MAX_V 100 /*最大节点数*/
#define VISITED 1
long int A[MAX_V+1][MAX_V+1];
long int D[MAX_V+1];
long int S[MAX_V+1],P[MAX_V+1];
int source , sink , N;
int step = 1;
int top = -1; /*堆栈指针*/
for ( i=1; i<=N; i++ )
for ( j=1; j<=N; j++ )
A[i][j] = Infinite; /*起始A[1..N][1..N]邻接矩阵*/
while ( fscanf(fptr,"%d %d %ld",&i,&j,&weight) != EOF )
exit(1);
}
else
Stack[++top] = value;
}
int Pop()
{
if ( top < 0 )
{
printf("Stack empty!\n");
exit(1);
}
return Stack[top--];
}
if ( (S[I] == NOTVISITED) && (D[t]+A[t][I] <= D[I]) )
{
D[I] = D[t] + A[t][I];
P[I] = t;
}
output_step();
}
output_path();
}
void init()
printf(" V%d",source);
while ( node != source )
{
Push(node);
node = P[node];
}
while( node != sink)
{
node = Pop();
printf(" --%ld-->",A[ P[node] ][node]);
printf("\n");
printf(" The shortest Path from V%d to V%d :",source,sink);
printf("\n------------------------------------------\n");
/*由终点开始将上一次经过的中间节点推入堆栈至到起始节点*/
{
FILE *fptr;
int i,j;
long int weight;
fptr = fopen("sh_path.dat","r");
if ( fptr == NULL )
{
perror("sh_path.dat");
exit(1);
}
fscanf(fptr,"%d",&N); /*读取图节点数*/
for ( i=1; i<=N; i++ )
printf(" P[%d]",i);
printf("\n");
for ( i=1; i<=N;i++ )
printf("%6ld",P[i]);
}
/*显示最短路径*/
void output_path()
{
int node = sink;
printf("V%d",node);
}
printf("\n Total length : %ld\n",D[sink]);
}
void Push(int value)
{
if ( top >= MAX_V )
{
printf("Stack overflow!\n");
P[i] = source;
}
S[source] = VISITED; /*始起节点设为已经走访*/
D[source] = 0;
}
int minD()
{
int i,t;
long int minimum = Infinite;
for ( i=1;i<=N;i++ )
printf("\n Step #%d",step);
printf("\n================================================\n");
for ( i=1; i<=N; i++ )
printf(" D[%d]",i);
printf("\n");
scanf("%d",&sink);
/* 起始各数组初值*/
for ( i = 1; i <= N; i++ )
{
S[i] = NOTVISITED; /*各顶点设为尚未访问*/
D[i] = A[source][i]; /*记录起始顶点至各顶点最短距离*/
init();
output_step();
for ( step =2;step <=N; step++ )
{
/* minD 传回一值t使得D[t] 为最小 */
t = minD();
S[t] = VISITED;
/* 找出经过t点会使路径缩短的节点*/
for ( I=1; I <= N; I++ )
#define NOTVISITED 0
#define Infinite 1073741823
/* A[1..N][1..N] 为图的邻接矩阵 */
/* D[i] i=1..N 用来储存某起始顶点到i节点的最短距离 */
/* S[1..N] 用来记录顶点是否已经访问过 */
/* P[1..N] 用来记录最近经过的中间节点 */
for ( i=1; i<=N; i++ )
if ( D[i] == Infinite )
printf(" ----");
else
printf("%6ld",D[i]);
printf("\n================================================\n");