首先,我们需要定义一个邻接表的数据结构来表示图。每个顶点用一个链表来存储与其相邻的边。// 邻接表中每个节点的结构typedef struct EdgeNode { int vertex; // 相邻顶点的索引 int weight; // 边的权值(票价) struct EdgeNode *next; // 指向下一个相邻边的指针} EdgeNode;// 邻接表中每个顶点的结构typedef struct VertexNode { int data; // 顶点的值 EdgeNode *firstEdge; // 指向第一条邻接边的指针} VertexNode;// 图的结构typedef struct Graph { VertexNode vertices[MAX_VERTICES]; // 顶点数组 int numVertices; // 顶点数} Graph;
接下来,我们需要实现Dijkstra算法来求最短路径。// Dijkstra算法求最短路径void Dijkstra(Graph *graph, int start, int end) { int dist[MAX_VERTICES]; // 存储起点到各个顶点的最短距离 bool visited[MAX_VERTICES]; // 标记顶点是否已被访问 int path[MAX_VERTICES]; // 存储最短路径的前驱顶点 // 初始化 for (int i = 0; i < graph->numVertices; i++) { dist[i] = INF; // 初始化为无穷大 visited[i] = false; path[i] = -1; } dist[start] = 0; // 起点到自身的距离为0 // 循环遍历所有顶点 for (int i = 0; i < graph->numVertices; i++) { // 找到当前未被访问的距离起点最近的顶点 int minDist = INF; int minIndex = -1; for (int j = 0; j < graph->numVertices; j++) { if (!visited[j] && dist[j] < minDist) { minDist = dist[j]; minIndex = j; } } if (minIndex == -1) { break; } visited[minIndex] = true; // 更新其他顶点的最短距离 EdgeNode *edge = graph->vertices[minIndex].firstEdge; while (edge != NULL) { int vertex = edge->vertex; int weight = edge->weight; if (!visited[vertex] && dist[minIndex] + weight < dist[vertex]) { dist[vertex] = dist[minIndex] + weight; path[vertex] = minIndex; } edge = edge->next; } } // 输出最短路径和距离 printf("从顶点 %d 到顶点 %d 的最低票价为 %d\n", start, end, dist[end]); printf("路径为:"); int current = end; int count = 0; int pathStack[MAX_VERTICES]; while (current != -1) { pathStack[count++] = current; current = path[current]; } for (int i = count - 1; i >= 0; i--) { printf("%d ", pathStack[i]); }}
最后,我们可以根据具体的数据来初始化图,并调用Dijkstra算法求解最低票价。int main() { Graph graph; graph.numVertices = 6; // 初始化顶点 for (int i = 0; i < graph.numVertices; i++) { graph.vertices[i].data = i + 1; graph.vertices[i].firstEdge = NULL; } // 添加边(有向边) addEdge(&graph, 1, 2, 10); // 顶点1到顶点2的票价为10 addEdge(&graph, 1, 3, 5); // 顶点1到顶点3的票价为5 addEdge(&graph, 2, 4, 6); // 顶点2到顶点4的票价为6 addEdge(&graph, 2, 5, 15); // 顶点2到顶点5的票价为15 addEdge(&graph, 3, 4, 4); // 顶点3到顶点4的票价为4 addEdge(&graph, 4, 5, 3); // 顶点4到顶点5的票价为3 addEdge(&graph, 4, 6, 8); // 顶点4到顶点6的票价为8 addEdge(&graph, 5, 6, 7); // 顶点5到顶点6的票价为7 Dijkstra(&graph, 1, 6); // 求顶点1到顶点6的最低票价 return 0;}
希望以上代码能够帮助你完成题目中的要求。当然,实际应用中可能需要更详细和复杂的数据结构和算法来表示和计算最短路径。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |