6 15
L M 56
L N 35
L Pa 21
L Pe 51
L T 60
M N 21
M Pa 57
M Pe 78
M T 70
N Pa 36
N Pe 68
N T 68
Pa Pe 51
Pa T 61
Pe T 13
kruskal算法
#include<iostream>#include<queue>#include<vector>#include<map>usingnamespace std;int G[50][50], d[50], father[50];
map<int, string>mm1;
map<string,int>mm2;struct edge
{int a, b;int cost;}e[50];booloperator<(edge a, edge b){return a.cost > b.cost;}intfindfather(int i){int a = i;while(father[i]!= i){
i = father[i];}while(father[a]!= a){int z = a;
a = father[a];
father[z]= i;}return i;}
priority_queue<edge>q;voidkruskal(int n,int m){int ans =0, num_edge =0;for(int i =0; i < n;++i){
father[i]= i;}for(int i =0; i < m;++i){int cost = q.top().cost;int faA =findfather(q.top().a);int faB =findfather(q.top().b);
q.pop();if(faA != faB){
father[faA]= faB;
ans += q.top().cost;
num_edge++;
cout <<"加入的第"<< num_edge <<"条边是:"<< mm1[faA]<<"--"<< mm1[faB]<<"花费是"<< cost << endl;if(num_edge == n -1)break;}}if(num_edge != n -1)
cout <<"无法构建最小生成树";return;}intmain(){int n, m; string a, b;
cin >> n >> m;int count =0;for(int i =0; i < m;++i){
cin >> a >> b >> e[i].cost;if(mm2.find(a)== mm2.end()){
mm1[count]= a;
mm2[a]= count;
count++;}
e[i].a = mm2[a];if(mm2.find(b)== mm2.end()){
mm1[count]= b;
mm2[b]= count;
count++;}
e[i].b = mm2[b];
q.push(e[i]);}kruskal(n, m);return0;}
prim算法
#include<iostream>#include<queue>#include<vector>#include<map>usingnamespace std;int G[50][50], d[50];bool visit[50];
map<int, string>mm1;
map<string,int>mm2;int n, m;
vector<int>vv;intfindmin(){int min =1000001;int xb =-1;for(int i =0; i < n;++i){if(visit[i]==false&&d[i]< min){
min = d[i];
xb = i;}}return xb;}voidprim(int x){int ans =0;
d[x]=0;while(1){int v =findmin();if(v ==-1)break;
visit[v]=true;
ans += d[v];
vv.push_back(v);for(int i =0; i < n;++i){if(visit[i]==false&&G[v][i]< d[i]){
d[i]= G[v][i];}}}
cout << ans << endl;}intmain(){int cost; string a, b;
cin >> n >> m;int count =0;fill(G[0], G[0]+50*50,1000001);fill(d, d +50,1000001);for(int i =0; i < m;++i){
cin >> a >> b >> cost;if(mm2.find(a)== mm2.end()){
mm1[count]= a;
mm2[a]= count;
count++;}if(mm2.find(b)== mm2.end()){
mm1[count]= b;
mm2[b]= count;
count++;}
G[mm2[a]][mm2[b]]= cost;
G[mm2[b]][mm2[a]]= cost;}prim(0);for(int i =0; i < vv.size();++i){
cout << mm1[vv[i]]<<" ";}return0;}
输入数据6 15L M 56L N 35L Pa 21L Pe 51L T 60M N 21M Pa 57M Pe 78M T 70N Pa 36N Pe 68N T 68Pa Pe 51Pa T 61Pe T 13kruskal算法#include<iostream>#include<queue>#include<vector>#include<map>using namespace std;int G[5.