Prim算法
1 #include<iostream> 2 using namespace std; 3 4 const int max = 100; 5 int Graph[max][max]; 6 7 void Prim(int v, int n) 8 { 9 int closet[max]; //存放顶点 10 int lowcost[max]; //存放权值 11 int i, j; 12 for (i = 0; i < n; ++i) 13 { 14 lowcost[i] = Graph[v][i]; 15 closet[i] = v; 16 } 17 int k; 18 for (i = 1; i < n; ++i) 19 { 20 int min = INT_MAX; 21 for(j = 0; j < n; ++j) 22 if (lowcost[j] != 0 && lowcost[j] < min) 23 { 24 min = lowcost[j]; 25 k = j; 26 } 27 printf(" 边(%d, %d)权为: %d ", closet[k], k, min); 28 lowcost[k] = 0; 29 for (j = 0; j < n; ++j) 30 if (Graph[k][j] != 0 && Graph[k][j] < lowcost[j]) 31 { 32 lowcost[j] = Graph[k][j]; 33 closet[j] = k; 34 } 35 } 36 } 37 38 int main() 39 { 40 int numV, numE; //numV:边数; numE:顶点 41 cin >> numV >> numE; 42 for (int i = 0; i < numE; ++i) 43 for (int j = 0; j < numE; ++j) 44 Graph[i][j] = INT_MAX; 45 for (int i = 0; i < numE; ++i) 46 Graph[i][i] = 0; 47 48 int a, b, c; 49 for (int i = 0; i < numV; ++i) 50 { 51 cin >> a >> b >> c; 52 Graph[a][b] = c; 53 Graph[b][a] = c; 54 } 55 int v; //V出发顶点 56 cin >> v; 57 Prim(v, numE); 58 }
输出结果:
Dijkstra算法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 using namespace std; 3 4 int matrix[100][100]; // 邻接矩阵 5 int S[100]; // 标记数组 6 int dist[100]; // 源点到顶点i的最短距离 7 int path[100]; // 记录最短路的路径 8 int vertex_num; // 顶点数 9 int edge_num; // 边数 10 11 void Dispath(int v) 12 { 13 int apath[100]; 14 int i, j, d, k; 15 for (i = 0; i < vertex_num; ++i) 16 if (S[i] == 1 && i != v) 17 { 18 cout << v << "---" << i << "路径长度为:" << dist[i] << " 路径为:"; 19 d = 0; 20 apath[d] = i; 21 k = path[i]; 22 if (k == -1) 23 cout << "无路径" << endl; 24 else 25 { 26 while (k != v) 27 { 28 ++d; 29 apath[d] = k; 30 k = path[k]; 31 } 32 ++d; 33 apath[d] = v; 34 cout << apath[d]; 35 for (j = d - 1; j >= 0; --j) 36 cout << ", " << apath[j]; 37 cout << endl; 38 } 39 } 40 } 41 42 void Dijkstra(int v) 43 { 44 int i, j, Mindis, u; 45 for (i = 0; i < vertex_num; ++i) 46 { 47 dist[i] = matrix[v][i]; 48 S[i] = 0; 49 if (matrix[v][i] < INT_MAX) 50 path[i] = v; 51 else 52 path[i] = -1; 53 } 54 S[v] = 1; 55 for (i = 0; i < vertex_num - 1; ++i) 56 { 57 Mindis = INT_MAX; 58 for (j = 0; j < vertex_num; ++j) 59 if (S[j] == 0 && dist[j] < Mindis) 60 { 61 u = j; 62 Mindis = dist[j]; 63 } 64 S[u] = 1; 65 for (j = 0; j < vertex_num; ++j) 66 if (S[j] == 0) 67 if (matrix[u][j] < INT_MAX && dist[u] + matrix[u][j] < dist[j]) 68 { 69 dist[j] = dist[u] + matrix[u][j]; 70 path[j] = u; 71 } 72 } 73 Dispath(v); 74 } 75 76 int main() 77 { 78 cout << "请输入图的顶点数(<100):"; 79 cin >> vertex_num; 80 cout << "请输入图的边数:"; 81 cin >> edge_num; 82 83 for (int i = 0; i < vertex_num; i++) 84 for (int j = 0; j < vertex_num; j++) 85 matrix[i][j] = (i != j) ? INT_MAX : 0; // 初始化 matrix 数组 86 cout << "请输入边的信息: "; 87 int u, v, w; 88 for (int i = 0; i < edge_num; i++) 89 { 90 cin >> u >> v >> w; 91 matrix[u][v] = w; 92 } 93 94 cout << "请输入源点(<" << vertex_num << "):"; 95 int source; //源点 96 cin >> source; 97 Dijkstra(source); 98 system("pause"); 99 return 0; 100 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> using namespace std; int matrix[100][100]; // 邻接矩阵 int S[100]; // 标记数组 int dist[100]; // 源点到顶点i的最短距离 int path[100]; // 记录最短路的路径 int vertex_num; // 顶点数 int edge_num; // 边数 void Dispath(int v) { int apath[100]; int i, j, d, k; for (i = 0; i < vertex_num; ++i) if (S[i] == 1 && i != v) { cout << v << "---" << i << "路径长度为:" << dist[i] << " 路径为:"; d = 0; apath[d] = i; k = path[i]; if (k == -1) cout << "无路径" << endl; else { while (k != v) { ++d; apath[d] = k; k = path[k]; } ++d; apath[d] = v; cout << apath[d]; for (j = d - 1; j >= 0; --j) cout << ", " << apath[j]; cout << endl; } } } void Dijkstra(int v) { int i, j, Mindis, u; for (i = 0; i < vertex_num; ++i) { dist[i] = matrix[v][i]; S[i] = 0; if (matrix[v][i] < INT_MAX) path[i] = v; else path[i] = -1; } S[v] = 1; for (i = 0; i < vertex_num - 1; ++i) { Mindis = INT_MAX; for (j = 0; j < vertex_num; ++j) if (S[j] == 0 && dist[j] < Mindis) { u = j; Mindis = dist[j]; } S[u] = 1; for (j = 0; j < vertex_num; ++j) if (S[j] == 0) if (matrix[u][j] < INT_MAX && dist[u] + matrix[u][j] < dist[j]) { dist[j] = dist[u] + matrix[u][j]; path[j] = u; } } Dispath(v); } int main() { cout << "请输入图的顶点数(<100):"; cin >> vertex_num; cout << "请输入图的边数:"; cin >> edge_num; for (int i = 0; i < vertex_num; i++) for (int j = 0; j < vertex_num; j++) matrix[i][j] = (i != j) ? INT_MAX : 0; // 初始化 matrix 数组 cout << "请输入边的信息: "; int u, v, w; for (int i = 0; i < edge_num; i++) { cin >> u >> v >> w; matrix[u][v] = w; } cout << "请输入源点(<" << vertex_num << "):"; int source; //源点 cin >> source; Dijkstra(source); system("pause"); return 0; }
输出结果: