1 // 2 // Created by alim on 2017/12/21. 3 // 4 5 #include "iostream" 6 #include "algorithm" 7 8 using namespace std; 9 const int INF = 0x3fffffff;//表示无穷大 10 const int N = 100;//节点最大值 11 bool s[N];//节点的集合 12 int closest[N];//最近点数组 13 int lowcost[N];//最小权值数组 14 15 void Prim(int n,int u0,int c[N][N]){ 16 /** 17 * 顶点个数n,开始节点u0,带权邻接矩阵c【n】【n】 18 * 如果s[i]==true,说明顶点i已加入集合(最小生成树);否则属于集合V-U 19 * 最后结果为lowcost 20 */ 21 s[u0]=true; 22 int i,j; 23 for (int i = 1; i <= n; ++i) { 24 if (i != u0) {//除u0之外的其他顶点 25 lowcost[i] = c[u0][i];//u0到其他顶点的距离 26 closest[i] = u0;//最近点初始化为u0 27 s[i] = false; 28 } else { 29 lowcost[i]=0; 30 } 31 } 32 for (int i = 1; i <= n; ++i) { 33 int temp = INF; 34 int t=u0; 35 for (int j = 1; j <= n; ++j) {//在集合V=U中寻找最近的点 36 if ((!s[j]) && (lowcost[j] < temp)) {// !s[j] 表示j节点属于集合V-U 37 t = j; 38 temp = lowcost[j]; 39 } 40 } 41 if (t == u0) { 42 break;//找不到t,跳出循环 43 } 44 s[t] = true; 45 for (int j = 1; j <= n; ++j) {//更新lowcost closest 46 if ((!s[j]) && (c[t][j] < lowcost[j])) { 47 lowcost[j] = c[t][j]; 48 closest[j] = t; 49 } 50 } 51 } 52 } 53 54 int main(){ 55 int n;//用户输入的节点数 56 int u0;//开始节点 57 int c[N][N];//邻接矩阵 58 int m;//边数m 59 int u,v,w; 60 61 cout << "输入节点数n和边数m:" << endl; 62 cin >> n >> m; 63 int sumcost = 0;//总权值 64 //初始化邻接矩阵 65 for (int i = 1; i <= n; ++i) { 66 for (int j = 1; j <= n; ++j) { 67 c[i][j]=INF; 68 } 69 } 70 cout << "请输入节点u,v 以及权值 w:" << endl; 71 for (int k = 1; k <= m; ++k) { 72 cin >> u >> v >> w; 73 c[u][v]=c[v][u]=w; 74 } 75 cout << "请输入任一节点u0:" << endl; 76 cin>>u0; 77 78 //计算最后的lowcost的总和,即为结果 79 Prim(n,u0,c); 80 81 cout << "数组lowcost的内容为:" << endl; 82 for (int l = 1; l <= n; ++l) { 83 cout<<lowcost[l]<<" "; 84 } 85 cout << endl; 86 for (int i = 1; i <= n; ++i) { 87 sumcost += lowcost[i]; 88 } 89 cout << "最短路径为:" << sumcost << endl << endl; 90 return 0; 91 }