一、Prim算法
#include<iostream>
using namespace std;
const int max = 10000;
class Hdu1233{
public:
void initial(int n);
void read_case();
void prim();
void print_result();
private:
int path[101][101];
int distance[101];
bool visited[101];
int village_num;
int min_sum;
};
void Hdu1233::initial(int n){
village_num = n;
min_sum = 0;
for (int i = 0; i < 101; i++){
for (int j = 0; j < 101; j++){
path[i][j] = max;
}
distance[i] = max;
}
memset(visited, false, sizeof(visited));
}
void Hdu1233::read_case(){
int v1, v2, w;
int num = village_num*(village_num - 1) / 2;
for (int i = 0; i < num; i++){
cin >> v1 >> v2 >> w;
path[v1][v2] = path[v2][v1] = w;
}
}
void Hdu1233::prim(){
int min;
int i, j, k;
visited[1] = true;//把节点1添加到最小生成树中
for (i = 1; i <= village_num; i++){
distance[i] = path[1][i];
}
for (i = 2; i <= village_num; i++){
min = max;
for (j = 1; j <= village_num; j++){//在剩余节点中,选择离最小生成树中节点距离最近的点
if (min > distance[j] && !visited[j]){
min = distance[j];
k = j;
}
}
min_sum += min;
visited[k] = true;//把节点k添加到最小生成树中
for (j = 1; j <= village_num; j++){
if (distance[j] > path[k][j] && !visited[j])
distance[j] = path[k][j];//更新distance
}
}
}
void Hdu1233::print_result(){
cout << min_sum << endl;
}
int main(){
int n;
Hdu1233 x;
while (cin >> n&&n){
x.initial(n);
x.read_case();
x.prim();
x.print_result();
}
return 0;
}
二、Kruskal算法
#include<iostream>
using namespace std;
const int max = 10000;
//边的定义
struct Edge{
int begin;
int end;
int weight;
};
class Hdu1233{
public:
void initial(int n);
void read_case();
int find(int n);
void kruskal();
void print_result();
private:
Edge edge[5000];
int father[101];//用来判断边与边是否形成环路
int edge_num;
int min_sum;
};
void Hdu1233::initial(int n){
edge_num = n*(n - 1) / 2;
min_sum = 0;
int i;
for (i = 0; i < 5000; i++){
edge[i].begin = 0;
edge[i].end = 0;
edge[i].weight = max;
}
for (i = 0; i < 101; i++)
father[i] = i;
}
int cmp(const void* a, const void* b){
Edge e1 = *(Edge*)a;
Edge e2 = *(Edge*)b;
return e1.weight - e2.weight;
}
void Hdu1233::read_case(){
int v1, v2, w;
for (int i = 0; i < edge_num; i++){
cin >> v1 >> v2 >> w;
edge[i].begin = v1;
edge[i].end = v2;
edge[i].weight = w;
}
qsort(edge, edge_num, sizeof(Edge), cmp);//按边的权值从小到大排序
}
int Hdu1233::find(int n){
int k = n;
while (k != father[k]){
k = father[k];
}
int t = n;
int temp;
while (t != k){//剪枝,减小深度
temp = father[t];
father[t] = k;
t = temp;
}
return k;
}
void Hdu1233::kruskal(){
int a, b;
for (int i = 0; i < edge_num; i++){
a = find(edge[i].begin);
b = find(edge[i].end);
if (a != b){//没有形成环时加入最小生成树
father[a] = b;
min_sum += edge[i].weight;
}
}
}
void Hdu1233::print_result(){
cout << min_sum << endl;
}
int main(){
int n;
Hdu1233 x;
while (cin >> n&&n){
x.initial(n);
x.read_case();
x.kruskal();
x.print_result();
}
return 0;
}