连通图的生成树是包含图中全部顶点的一个极小连通子图。
无向连通网的生成树各边的权值之和称为该生成树的代价,在图的所有生成树中,代价最小的生成树称为最小生成树。
Prim
#include<bits/stdc++.h>
using namespace std;
const int MaxSize = 10;
int visited[MaxSize] = { 0 };
string vertex[MaxSize];
int edge[MaxSize][MaxSize];
int vertexNum, edgeNum;
int MinEdge(int r[], int n);
void MGraph(string a[], int n, int e)
{
int i, j, k, w;
vertexNum = n; edgeNum = e;
for (i = 0; i < vertexNum; i++)
vertex[i] = a[i];
for (i = 0; i < vertexNum; i++)
for (j = 0; j < vertexNum; j++)
if (i == j)
edge[i][j] = 0;
else
edge[i][j] = 100;
for (k = 0; k < edgeNum; k++)
{
cin >> i >> j >> w;
edge[i][j] = w; edge[j][i] = w;
}
}
void Prim(int v)
{
int i, j, k;
int adjvex[MaxSize], lowcost[MaxSize];
for (i = 0; i < vertexNum; i++)
{
lowcost[i] = edge[v][i]; adjvex[i] = v;
}
lowcost[v] = 0;
for (k = 1; k < vertexNum; k++)
{
j = MinEdge(lowcost, vertexNum);
cout << "(" << vertex[j] << "," << vertex[adjvex[j]] << ")" << lowcost[j] << endl;
lowcost[j] = 0;
for (i = 0; i < vertexNum; i++)
if (edge[i][j] < lowcost[i]) {
lowcost[i] = edge[i][j];
adjvex[i] = j;
}
}
}
int MinEdge(int r[], int n)
{
int index = 0, min = 100;
for (int i = 1; i < n; i++)
if (r[i] != 0 && r[i] < min)
{
min = r[i]; index = i;
}
return index;
}
int main()
{
string chs[] = { "A","B","C","D","E","F" };
MGraph(chs, 6, 9);
Prim(0);
return 0;
}