最小支撑树之prim算法

无向图的最小支撑树算法:prim算法。

#include "stdafx.h"
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define MAXVEX 20
#define INFINY 65536
struct graph{
 int numberV,numberE;
 int V[MAXVEX];    //图的顶点
 int E[MAXVEX][MAXVEX];  //图的边的权重
};
//图的创建
void createGraph(graph *G)
{
 G->numberV=5;
 G->numberE=7;
 for(int i=0;i<G->numberV;i++)
   G->V[i]=i;
 for(int i=0;i<G->numberV;i++)    //对图进行初始化
  for(int j=0;j<G->numberV;j++)
  {
   if(i==j)
    G->E[i][j]=0;
   else
      G->E[i][j]=INFINY;
  }
  G->E[0][1]=10;
  G->E[0][2]=20;
  G->E[0][3]=3;
  G->E[1][2]=5;
  G->E[1][3]=2;
  G->E[2][4]=11;
  G->E[3][4]=15;
 for(int i=0;i<G->numberV;i++)
  for(int j=i;j<G->numberV;j++)
   G->E[j][i]=G->E[i][j]; 
}
void minTree(graph *G)
{
 int adjV[MAXVEX];    //存放处理顶点的下标
 int lowcost[MAXVEX];  //存放最小的权值
 adjV[0]=0;
 lowcost[0]=0;
 for(int i=1;i<G->numberV;i++)
 {
  lowcost[i]=G->E[0][i];
  adjV[i]=0;
 }
 for(int i=0;i<G->numberV;i++)
 {
  int min=INFINY;
  int k=0;
  for(int j=1;j<G->numberV;j++)
  {
   if(lowcost[j]!=0&&min>lowcost[j])
   {
    min=lowcost[j];
    k=j;
   }
  }
  lowcost[k]=0;
  if(adjV[k]!=k)
      printf("%d-%d  ",adjV[k],k);
  for(int j=1;j<G->numberV;j++)
  {
   if(lowcost[j]!=0&&G->E[k][j]<lowcost[j])
   {
    lowcost[j]=G->E[k][j];
    adjV[j]=k;
   }
  }
 }
 printf("\n");

}
int main(int argc,char**agrv)
{
 graph m;
 createGraph(&m);
 minTree(&m);
 return 0;
}

 

你可能感兴趣的:(算法,struct,Graph)