prim algorithm

来源:互联网 发布:js获取cookie 编辑:程序博客网 时间:2024/06/06 12:20

/*
prim algorithm
author:wuzuquan
last_modify:2008-1-10
*/
#include<stdio.h>
#include<assert.h>
#include "min_heapsort.h"

#define VNUM 9
#define NIL 100
extern int heap_size;
extern int length=VNUM;
typedef struct
{
 int v;
 int w;
}edge;
/*紧缩邻接表实现赋权无向图*/
edge list[29]={ {1,4},{7,8},
    {0,4},{2,8},{7,11},
    {1,8},{3,7},{5,4},{8,2},
    {2,7},{4,9},{5,14},
    {3,9},{5,10},
    {2,4},{3,14},{4,10},{6,2},
    {5,2},{7,1},{8,6},
    {0,8},{1,11},{6,1},{8,7},
    {2,2},{6,6},{7,7}};
int head[VNUM+1]={0,2,5,9,12,14,18,21,25,28};

void mst_prim(int *parent, int *key, int source)
{
 int u=0;
 int Q[VNUM+1];/*最小优先级队列*/
 assert(parent!=NULL && key!=NULL);/*检查内存是否可用*/
 Q[0]=INT_MAX;
 for (u; u<VNUM; u++)
 {/*initialize,下标从1开始,0位置的元素不使用*/
  key[u]=INT_MAX;
  parent[u]=NIL;
  Q[u+1]=u;
 }

 key[source]=0;
 build_min_heap(Q);/*对每一个非叶子结点都调用一次min_heaplfy*/

 while (heap_size>0)
 {
  int v=0;
  u=heap_extract_min(Q);/*将最小的关键字出列*/
  for (v=head[u]; v<head[u+1]; v++)
  {
   char vertex=list[v].v;
   if (vertex >= minimum(Q) && list[v].w < key[vertex])
   {
    parent[vertex]=u;
    key[vertex]=list[v].w;
   }
  }
 }
}

void printkey(int *parent, int *key)
{
 int i=0;
 for (i=1; i<VNUM; i++)
 {
        printf("%c--%c: %d/n",i+'a',parent[i]+'a',key[i]);
 }
}

int main()
{
 int key[VNUM];
 int parent[VNUM+1];/*父结点数组*/
 mst_prim(parent,key,0);
 printkey(parent,key);
 return 0;