Dijkstra 算法和 Prim 算法实现 - C 语言代码详解
{///'title///': ///'Dijkstra 算法和 Prim 算法实现 - C 语言代码详解///', ///'description///': ///'本代码使用 C 语言实现了 Dijkstra 算法和 Prim 算法,用于求解带权重的图的最短路径和最小生成树问题。代码包含详细的注释,并提供了一些优化建议。///', ///'keywords///': ///'Dijkstra 算法, Prim 算法, 最短路径, 最小生成树, 图算法, C 语言, 代码实现///', ///'content///': ///'#include <stdio.h>//n#include <stdbool.h>//n#include <limits.h>//n#define MAX_CITIES 100//n//nint numCities, numRoads;//nint graph[MAX_CITIES][MAX_CITIES]; //n//nvoid initializeGraph(int n) {//n numCities = n;//n for (int i = 0; i < numCities; i++) {//n for (int j = 0; j < numCities; j++) {//n graph[i][j] = 0;//n }//n }//n}//n//nvoid addRoad(int city1, int city2, int distance) {//n graph[city1][city2] = distance;//n graph[city2][city1] = distance;//n}//n//nint findMinKey(int key[], bool mstSet[]) {//n int min = INT_MAX, min_index;//n//n for (int i = 0; i < numCities; i++) {//n if (mstSet[i] == false && key[i] < min) {//n min = key[i];//n min_index = i;//n }//n }//n//n return min_index;//n}//n//nvoid printMST(int parent[]) {//n printf(///'最小生成树的边://n///');//n for (int i = 1; i < numCities; i++) {//n printf(///'%d - %d//n///', parent[i], i);//n }//n}//n//nvoid printShortestPath(int destination, int parent[]) {//n if (parent[destination] == -1) {//n printf(///'%d ///', destination);//n return;//n }//n//n printShortestPath(parent[destination], parent);//n printf(///'-> %d ///', destination);//n}//n//nvoid dijkstra(int startCity) {//n int distances[MAX_CITIES];//n bool visited[MAX_CITIES];//n int parent[MAX_CITIES];//n//n for (int i = 0; i < numCities; i++) {//n distances[i] = INT_MAX;//n visited[i] = false;//n parent[i] = -1;//n }//n//n distances[startCity] = 0;//n//n for (int count = 0; count < numCities - 1; count++) {//n int u = findMinKey(distances, visited);//n visited[u] = true;//n//n for (int v = 0; v < numCities; v++) {//n if (!visited[v] && graph[u][v] && distances[u] != INT_MAX && distances[u] + graph[u][v] < distances[v]) {//n distances[v] = distances[u] + graph[u][v];//n parent[v] = u;//n }//n }//n }//n//n printf(///'从起始城市到其他城市的最短路径://n///');//n for (int i = 0; i < numCities; i++) {//n if (i != startCity) {//n printf(///'从 %d 到 %d 的最短路径为:///', startCity, i);//n printShortestPath(i, parent);//n printf(///'//n///');//n }//n }//n}//n//nvoid primMST() {//n int parent[MAX_CITIES];//n int key[MAX_CITIES]; //n//n bool mstSet[MAX_CITIES];//n//n for (int i = 0; i < numCities; i++) {//n key[i] = INT_MAX;//n mstSet[i] = false;//n }//n//n key[0] = 0;//n parent[0] = -1; //n//n for (int count = 0; count < numCities - 1; count++) {//n int u = findMinKey(key, mstSet);//n mstSet[u] = true;//n//n for (int v = 0; v < numCities; v++) {//n if (graph[u][v] && mstSet[v] == false && graph[u][v] < key[v]) {//n parent[v] = u;//n key[v] = graph[u][v];//n }//n }//n }//n//n printMST(parent);//n}//n//nint main() {//n int i, city1, city2, distance;//n//n printf(///'请输入城市数量:///');//n scanf(///'%d///', &numCities);//n//n printf(///'请输入道路数量:///');//n scanf(///'%d///', &numRoads);//n//n initializeGraph(numCities);//n//n printf(///'请输入每条道路的起始城市、目标城市和距离://n///');//n for (i = 0; i < numRoads; i++) {//n printf(///'道路 %d:///', i + 1);//n scanf(///'%d %d %d///', &city1, &city2, &distance);//n addRoad(city1, city2, distance);//n }//n//n int startCity;//n printf(///'请输入起始城市:///');//n scanf(///'%d///', &startCity);//n//n dijkstra(startCity);//n primMST();//n//n return 0;//n}//n讲解一下该代码算法的原理和工作方式,以及提出一些相关问题并回答,最后提供一些可以改进的建议内容:这段代码实现了Dijkstra算法和Prim算法,用于求解带权重的图的最短路径和最小生成树问题。//n//n首先,代码定义了一个具有最大城市数量的二维数组graph,用于表示城市之间的道路及其距离。initializeGraph函数用于初始化这个数组。//n//naddRoad函数用于向graph数组添加一条道路和其距离。//n//nfindMinKey函数用于找到最小键值的城市,即距离起始城市最近的城市。//n//nprintMST函数用于打印最小生成树的边。//n//nprintShortestPath函数用于递归打印最短路径。//n//ndijkstra函数使用Dijkstra算法来求解从起始城市到其他城市的最短路径。//n//nprimMST函数使用Prim算法来求解最小生成树。//n//n在main函数中,用户输入城市数量和道路数量,并通过循环输入每条道路的起始城市、目标城市和距离。然后,用户输入起始城市,最后调用dijkstra函数和primMST函数来求解最短路径和最小生成树。//n//n一些相关问题和回答://n//n1. Dijkstra算法和Prim算法分别用于解决什么问题?//n - Dijkstra算法用于求解带权重的图的最短路径问题。//n - Prim算法用于求解带权重的图的最小生成树问题。//n//n2. 为什么在Dijkstra算法和Prim算法中使用INT_MAX来表示无穷大?//n - INT_MAX是整型变量的最大值,用它表示无穷大可以方便比较和更新最小值。//n//n3. 为什么在Dijkstra算法中使用bool数组visited来标记已访问的城市?//n - visited数组用于标记已经找到最短路径的城市,避免重复计算。//n//n4. 为什么在Prim算法中使用bool数组mstSet来标记已加入最小生成树的城市?//n - mstSet数组用于标记已经加入最小生成树的城市,避免重复加入。//n//n一些建议://n//n1. 使用动态内存分配来创建graph数组,以避免固定数组大小的限制。//n2. 考虑使用邻接表来表示图,以减少存储空间和提高算法效率。//n3. 添加输入验证,确保用户输入的城市和道路数量不超过最大限制。//n4. 考虑使用更具有可读性的变量名和函数名。//n5. 添加错误处理机制,例如处理无法找到最短路径的情况。//n//n/
原文地址: https://www.cveoy.top/t/topic/pNOp 著作权归作者所有。请勿转载和采集!