/*贪心算法_无向图最小生成树*/
#include <stdlib.h>
#include <iostream>
#include <memory.h>
using namespace std;
int main()
{
int N, M;
int selected[100];
int E[100][2];
int value[100];
int T[100];
int min, minE, ValueT;
cin >> N >> M;
for(int i=1; i<= M; i++){
cin >> E[i][0] >> E[i][1] >> value[i];
}
memset(selected, 0 , sizeof(selected) );
memset(T, 0, sizeof(T));
ValueT = 0;
//N个点的最小生成树有N-1条边
for(int i=1; i<=N-1; i++){
min = 6000;
minE = 0;
//每次选取没有被选过的边中最小边长的边
for(int j = 1; j <= M; j++){
if(selected[j] == 0){
//不构成圈
//if( ( (T[E[j][0]] == 0 ) ^ (T[E[j][1]]==0) ) || i == 1)
//当两个点没有同时出现在T中,即没有都被选过,或者是第一条边时,不构成圈
if( ( (T[E[j][0]] == 0 ) && (T[E[j][1]]==1) ) || ( (T[E[j][0]] == 1 ) && (T[E[j][1]]==0) ) || i == 1){
if(value[j] < min){
min = value[j];
minE = j;
}
}
}
}
//选完一条边后标识为1
selected[minE] = 1;
//标识该条边的起点和终点都被选过了,标识为1
T[E[minE][0]] = 1;
T[E[minE][1]] = 1;
//最小生成树的长度加上选择的边长度
ValueT = ValueT + min;
}
cout << "Length = " << ValueT << endl;
for(int i=1; i<= M; i++){
if(selected[i] == 1){
cout << "(" << E[i][0] << "," << E[i][1] << ")" << endl;
}
}
system("pause");
return 0;
}
贪心算法_无向图最小生成树*
最新推荐文章于 2021-05-24 21:44:26 发布