【数据结构 | C语言】求图(邻接表)两个顶点之间的简单路径算法 C语言实现


算法

void SamplePath(pGraph graph, ElemType vexa, ElemType vexb) {
   
	// path是结构体类型,存放图的顶点,和存储数量。就是个栈
    Path *path = (Path *) malloc(sizeof(Path))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
下面是C语言实现Dijkstra算法的代码,采用邻接表作为存储结构: ```c #include <stdio.h> #include <stdlib.h> #include <limits.h> #define MAX_VERTEX 100 // 图的最大顶点数 #define INF INT_MAX // 无穷大 // 定义邻接表中的结点 typedef struct node { int vertex; // 目标顶点 int weight; // 权重 struct node *next; // 下一个邻接点 } Node; // 定义邻接表 typedef struct graph { int V; // 顶点数 int E; // 边数 Node **adjList; // 邻接表 } Graph; // 初始化邻接表 Graph *initGraph(int V) { Graph *G = (Graph *) malloc(sizeof(Graph)); G->V = V; G->E = 0; G->adjList = (Node **) malloc(sizeof(Node *) * V); for (int i = 0; i < V; i++) { G->adjList[i] = NULL; } return G; } // 添加边 void addEdge(Graph *G, int u, int v, int w) { Node *newNode = (Node *) malloc(sizeof(Node)); newNode->vertex = v; newNode->weight = w; newNode->next = G->adjList[u]; G->adjList[u] = newNode; G->E++; } // 打印最短路径 void printPath(int *parent, int v) { if (parent[v] == -1) { printf("%d ", v); return; } printPath(parent, parent[v]); printf("%d ", v); } // Dijkstra算法 void dijkstra(Graph *G, int s) { int dist[MAX_VERTEX]; // 记录源点到各点的最短距离 int parent[MAX_VERTEX]; // 记录最短路径中各点的父结点 int visited[MAX_VERTEX] = {0}; // 记录各点是否已访问 for (int i = 0; i < G->V; i++) { dist[i] = INF; parent[i] = -1; } dist[s] = 0; for (int i = 0; i < G->V - 1; i++) { int u = -1; for (int j = 0; j < G->V; j++) { if (!visited[j] && (u == -1 || dist[j] < dist[u])) { u = j; } } visited[u] = 1; Node *temp = G->adjList[u]; while (temp != NULL) { int v = temp->vertex; int w = temp->weight; if (!visited[v] && dist[u] + w < dist[v]) { dist[v] = dist[u] + w; parent[v] = u; } temp = temp->next; } } // 打印结果 for (int i = 0; i < G->V; i++) { if (i != s) { printf("%d -> %d: ", s, i); if (dist[i] == INF) { printf("No path\n"); } else { printPath(parent, i); printf("(distance = %d)\n", dist[i]); } } } } int main() { int V = 5; Graph *G = initGraph(V); addEdge(G, 0, 1, 10); addEdge(G, 0, 4, 5); addEdge(G, 1, 2, 1); addEdge(G, 1, 4, 2); addEdge(G, 2, 3, 4); addEdge(G, 3, 2, 6); addEdge(G, 3, 0, 7); addEdge(G, 4, 1, 3); addEdge(G, 4, 2, 9); addEdge(G, 4, 3, 2); dijkstra(G, 0); return 0; } ``` 上面的代码中,`initGraph`函数用于初始化邻接表,`addEdge`函数用于添加边,`printPath`函数用于打印最短路径,`dijkstra`函数用于实现Dijkstra算法。在`main`函数中,我们创建了一个有向图,并调用`dijkstra`函数求出从源点0到其余各顶点的最短路径

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

竹一笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值