
//Gang #include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #include<cstdlib> #include<cmath> #define FOR(x,y,z) for(int x=y;x<=z;x++) #define REP(x,y,z) for(int x=y;x>=z;x--) #define ll long long using namespace std; ][]; //邻接矩阵 ]; //标记数组 ]; //边的权值 ]; //记录生成树的路径 int source; //指定生成树的起点 int vertex_num; //顶点数 int arc_num; //弧数 int sum; //生成树权和 void Prim(int source) { memset(visited, , sizeof(visited)); visited[source] = true; ; i < vertex_num; i++) { low_cost[i] = matrix[source][i]; path[i] = source; } int min_cost; //权值最小 int min_cost_index; //权值最小的下标 sum = ; ; i < vertex_num; i++) //除去起点,还需要找到另外vertex_num-1个点 { min_cost = INT_MAX; ; j < vertex_num; j++) { if (visited[j] == false && low_cost[j] < min_cost) //找到权值最小 { min_cost = low_cost[j]; min_cost_index = j; } } visited[min_cost_index] = true; //该点已找到,进行标记 sum += low_cost[min_cost_index]; //更新生成树权和 ; j < vertex_num; j++) //从找到的最小下标更新low_cost数组 { if (visited[j] == false && matrix[min_cost_index][j] < low_cost[j]) { low_cost[j] = matrix[min_cost_index][j]; path[j] = min_cost_index; } } } } int main() { cin >> vertex_num; cin >> arc_num; ; i < vertex_num; i++) ; j < vertex_num; j++) matrix[i][j] = INT_MAX; //初始化matrix数组 int u, v, w; ; i < arc_num; i++) { cin >> u >> v >> w; matrix[u][v] = matrix[v][u] = w; } cout << vertex_num; cin >> source; Prim(source); cout << sum << endl; ; i < vertex_num; i++) if (i != source) cout << i << "----" << path[i] << endl; ; }