#include<iostream>
using namespace std;
const int MAX = 15;
struct Edge
{
int begin;
int end;
int weight;
};
class Graph
{
private:
int vertex_num;
int edge_num;
Edge edges[MAX];
char vertex[MAX];
int parent[MAX];
int locate(char ch);
void sort(Edge *edges);
int find_root(int *parent, int node);
public:
Graph(int v, int e);
void kruskal();
};
int Graph::locate(char ch)
{
int i = 0;
for (; i < this->vertex_num; i++)
{
if (this->vertex[i] == ch)
{
break;
}
}
return i;
}
Graph::Graph(int v, int e) : vertex_num(v), edge_num(e)
{
cout << "请输入这" << this->vertex_num << "个顶点:" << endl;
for (int i = 0; i < this->vertex_num; i++)
{
cin >> this->vertex[i];
}
for (int i = 0; i < this->vertex_num; i++)
{
this->parent[i] = -1;
}
cout << "请输入两个顶点及其权值:" << endl;
for (int i = 0; i < this->edge_num; i++)
{
char first, second;
cin >> first >> second >> edges[i].weight;
edges[i].begin = this->locate(first);
edges[i].end = this->locate(second);
}
}
void Graph::sort(Edge *edge)
{
for (int i = 0; i < this->edge_num - 1; i++)
{
for (int j = 0; j < this->edge_num - i - 1; j++)
{
if (edges[j].weight > edges[j + 1].weight)
{
int temp1, temp2, temp3;
temp1 = edges[j + 1].weight;
edges[j + 1].weight = edges[j].weight;
edges[j].weight = temp1;
temp2 = edges[j + 1].begin;
edges[j + 1].begin = edges[j].begin;
edges[j].begin = temp2;
temp3 = edges[j + 1].end;
edges[j + 1].end = edges[j].end;
edges[j].end = temp3;
}
}
}
}
int Graph::find_root(int *parent, int node)
{
while (this->parent[node] > -1)
{
node = this->parent[node];
}
return node;
}
void Graph::kruskal()
{
int i, m, n;
this->sort(this->edges);
for (i = 0; i < this->edge_num; i++)
{
n = this->find_root(this->parent, this->edges[i].begin);
m = this->find_root(this->parent, this->edges[i].end);
if (n != m)
{
this->parent[n] = m;
cout << "("
<< this->vertex[this->edges[i].begin]
<< ","
<< this->vertex[this->edges[i].end]
<< ")\t权值为:"
<< this->edges[i].weight << endl;
}
}
}
int main()
{
int v = 0, e = 0;
cout << "请输入图的顶点数和边数:" << endl;
cin >> v >> e;
Graph g(v, e);
cout << "最小生成树:" << endl;
g.kruskal();
system("pause");
return 0;
}