数据结构学习笔记-Dijkstra算法(C语言邻接表实现)

Dijkstra算法是计算有权值图的单源最短路径问题的经典算法

算法核心思想:定义一个顶点集合S{V0,V1,……Vn},初始条件下集合S中只包含起始源点。

对于所有顶点V,定义dist[V]来表示V到源点的最短距离。

每次循环在所有未被收录进集合S的顶点中,挑选出dist值最小的顶点Vmin,将其收录进集合S。

当一个顶点V被收录进集合S中时,检测V的所有邻接点的dist值是否产生变化。

注意:Dijkstra算法不能处理负权边。

变量定义和初始化:

double dist[Graph->nV];
int path[Graph->nV];
int dijkstra[Graph->nV];

dist数组用于记录任一顶点到源点的最短距离,path数组用来记录通过最短距离找到该顶点的路径(path[V]即V的前一个必经顶点),dijkstra数组用来标记顶点是否被收录进集合S;

for(int i=0;i<Graph->nV;i++){
    dist[i]=__DBL_MAX__,path[i]=-1,dijkstra[i]=0;
}
dijkstra[start]=1;
dist[start]=0;

将所有顶点的dist值初始为正无穷,所有顶点的路径(指示前一顶点)初始为-1,集合S初始为空。

对于源点V,首先将其收录到集合S中,

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Dijkstra算法C语言邻接表实现可以参考以下代码: ```c #include <stdio.h> #include <stdbool.h> #define MAX 1000 #define INF 9999 typedef struct Node { int vertex; int weight; struct Node* next; } Node; typedef struct Graph { Node* adjList[MAX]; int V; int E; } Graph; Graph* createGraph(int V) { Graph* graph = (Graph*)malloc(sizeof(Graph)); graph->V = V; graph->E = 0; for (int i = 0; i < V; i++) { graph->adjList[i = NULL; } return graph; } void addEdge(Graph* graph, int src, int dest, int weight) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->vertex = dest; newNode->weight = weight; newNode->next = graph->adjList[src]; graph->adjList[src = newNode; } void dijkstra(Graph* graph, int start) { int distance[MAX]; bool visited[MAX]; for (int i = 0; i < graph->V; i++) { distance[i = INF; visited[i = false; } distance[start = 0; for (int count = 0; count < graph->V - 1; count++) { int minDistance = INF; int minIndex; for (int v = 0; v < graph->V; v++) { if (visited[v == false && distance[v <= minDistance) { minDistance = distance[v]; minIndex = v; } } visited[minIndex = true; Node* temp = graph->adjList[minIndex]; while (temp != NULL) { int v = temp->vertex; int weight = temp->weight; if (visited[v == false && distance[minIndex != INF && distance[minIndex + weight < distance[v]) { distance[v = distance[minIndex + weight; } temp = temp->next; } } printf("Vertex\tDistance from Start\n"); for (int i = 0; i < graph->V; i++) { printf("%d\t%d\n", i, distance[i]); } } int main() { int V = 5; // 顶点数 Graph* graph = createGraph(V); addEdge(graph, 0, 1, 10); addEdge(graph, 0, 4, 5); addEdge(graph, 1, 2, 1); addEdge(graph, 1, 4, 2); addEdge(graph, 2, 3, 4); addEdge(graph, 3, 2, 6); addEdge(graph, 3, 0, 7); addEdge(graph, 4, 1, 3); addEdge(graph, 4, 2, 9); addEdge(graph, 4, 3, 2); int start = 0; // 起始顶点 dijkstra(graph, start); return 0; } #### 引用[.reference_title] - *1* *2* [Dijkstra算法&&邻接表数组](https://blog.csdn.net/qq_30182475/article/details/93346088)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Dijkstra算法(一)之 C语言详解](https://blog.csdn.net/m0_37156901/article/details/103623342)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值