无向图的最小支撑树算法: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;
}