typedef struct MinHeap{
int num;//存储顶点序号
int w; //存储顶点到最小生成树的距离
} MinHeap; //最小堆结构体
int map[MAX][MAX] = {0};//邻接矩阵存储图信息
int Locate(VertexNode *GL, int u, int v);//判断u,v是否是邻接点
void CreateGraph(VertexNode *GL, int n, int m);//创建邻接表图(人工图)
void CreateGraph_2(VertexNode *GL, int n, int m);//创建邻接表图(随机图)
void PrintGraph(VertexNode *GL, int n);//输出图
void DestroyGL(VertexNode *GL, int n);//销毁图并释放空间
void Prime(VertexNode *GL, int n, int v0);//Prime算法求最小生成树(原始版本)
void Prime_MinHeap(VertexNode *GL, int n, int v0);//Prime算法求最小生成树(优先队列版本)
void BuildMinHeap(MinHeap que[], int n);
void MinHeapSiftDown(MinHeap que[], int n, int pos);
void MinHeapSiftUp(MinHeap que[], int n, int pos);
void ChangeKey(MinHeap que[], int pos, int weight);//将第pos个元素的关键字值改为weight
int SearchKey(MinHeap que[], int pos, int weight);//查找最小堆中关键字值为k的元素下标,未找到则返回-1(非递归)
int ExtractMin(MinHeap que[]);//删除并返回最小堆中具有最小关键字的元素
int main()
{
int i, j, m, n, v0 = 0;
VertexNode GL[MAX];
int Locate(VertexNode *GL, int u, int v)//判断u,v是否是邻接点
{
EdgeNode *e = GL[u].firstEdge;
while (e)
{
if (e->adjvex == v)
return 1;
e = e->next;
}
return 0;
}
void DestroyGL(VertexNode *GL, int n)
{
int i;
EdgeNode *e, *q;
for (i=0; i<n; i++)
{
e = GL[i].firstEdge;
do
{
q = e->next;
free(e);
e = q;
} while (e);
GL[i].firstEdge = NULL;
}
}
void Prime(VertexNode *GL, int n, int v0)//Prime算法求最小生成树(原始版本)
{
int book[MAX] = {0}; //标记该顶点是否已经在路径中
int dic[MAX] = {0}; //存储顶点到最小生成树的距离
int adj[MAX] = {0}; //存储顶点在最小生成树树中的邻接点序号
int min, i, j, k;
EdgeNode *e;
for (i=0; i<n; i++) //每趟确定一个新顶点,共n趟
{
min = INFINITY;
k = v0;
for (j=0; j<n; j++)//找出离最小生成树最近的顶点k
{
if (book[j] == 0 && dic[j] < min)
{
min = dic[j];
k = j;
}
}
min = 0;
for (i=0; i<n; i++) //输出各顶点在最小生成树中的邻接点及边的长度
{
//printf("<%d, %d> = %d\n", adj[i], i, dic[i]);
min += dic[i];
}
printf("最小生成树总长度(权值)为 %d\n", min);
}
void Prime_MinHeap(VertexNode *GL, int n, int v0)//Prime算法求最小生成树(优先队列版本)
{
int book[MAX] = {0}; //标记该城市是否已经在路径中
int dic[MAX] = {0}; //存储顶点到最小生成树的距离
int adj[MAX] = {0}; //存储顶点在最小生成树树中的邻接点序号
MinHeap que[MAX+1];//最小堆用来存储顶点序号和到最小生成树的距离
int min, i, j, k, pos;
EdgeNode *e;