【图】最小生成树Prim算法和Kruskal算法

来源:互联网 发布:java基础入门课后题 编辑:程序博客网 时间:2024/04/28 13:37

一、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;}


0 0
原创粉丝点击