最小生成树之Prim算法C语言

  • 基本思路
    最小生成树之Prim算法C语言_第1张图片
  • 举例
如下图
dist的初值都设为11111;vcount=0用来标记收录的个数
刚开始把结点v1收录,dist[v1]=0代表已经收录;
	更新结点v1的未被收录的邻结点的dist值:dist[v2]=2,dist[v3]=4,dist[v4]=1
然后找到未收录结点中最小dist是v4,把v4收录,dist[v4]=0
	更新结点v4的未被收录的邻结点的dist值:dist[v3]=2,dist[v6]=8,dist[v7]=4,dist[v5]=7,
然后找到未收录结点中最小dist是v2,把v2收录,dist[v2]=0
	更新结点v2的未被收录的邻结点的dist值:v2未被收录的邻结点只有v5,G[2][5]=10>dist[5]=7,所以不用更新
然后找到未收录结点中最小dist是v3,把v3收录,dist[v3]=0
	更新结点v3的未被收录的邻结点的dist值:dist[v6]=5,
然后找到未收录结点中最小dist是v7,把v7收录,dist[v7]=0
	更新结点v7的未被收录的邻结点的dist值:dist[v5]=6,dist[v6]=1
然后找到未收录结点中最小dist是v6,把v6收录,dist[v6]=0
	更新结点v6的未被收录的邻结点的dist值:结点v6的邻结点都被收录过了
然后找到未收录结点中最小dist是v5,把v5收录,dist[v5]=0
	更新结点v5的未被收录的邻结点的dist值:都被收录了

最后还需判断vcount是否等于结点个数,不等于说明不是连通图

最小生成树之Prim算法C语言_第2张图片

  • 代码
#include <stdio.h>
#include <stdlib.h> 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
#define ElementType int
#define MAXSIZE 10
#define MAX 11111
typedef struct GraphNode
{
	int G[MAXSIZE][MAXSIZE];
}Graph;
void Prim(Graph* graph,int n,int dist[MAXSIZE],int parent[MAXSIZE])
{
	//dist[0]=1;
	parent[0]=-1;
	int vcount=0;
	while(1)
	{
		int min=11112;
		int v=-1;
		for(int i=0;i<n;i++)
		{
			if(dist[i]!=0 && dist[i]<min)
			{
				min=dist[i];
				v=i;	
			}
		}
		if(v==-1)
		{
			if(vcount!=n)
			{
				printf("失败!");
			}	
			else
			{
				 
				for(int i=0;i<n;i++)
				{
					printf("%d ",parent[i]);
				} 
			}
			return;
		}	
		dist[v]=0;
		vcount++;
		for(int w=0;w<n;w++)
		{
			if(dist[w]!=0 && graph->G[v][w]<dist[w])
			{
				dist[w]=graph->G[v][w];
				parent[w]=v;
			}
		}
		
	}
	
	
}
int main(int argc, char** argv) {
	
	Graph* graph=(Graph*)malloc(MAXSIZE*sizeof(GraphNode));
	int node_num,edge_num;
	scanf("%d %d",&node_num,&edge_num);
	int dist[MAXSIZE];
	int parent[MAXSIZE];
	for(int i=0;i<node_num;i++)
	{
		dist[i]=MAX;
		parent[i]=0;
		for(int j=0;j<node_num;j++)
		{
			
			graph->G[i][j]=MAX;
		}
		
	}
	for(int i=0;i<edge_num;i++)
	{
			
		int start,end,value;
		scanf("%d %d %d",&start,&end,&value);
		graph->G[start][end]=value;
		graph->G[end][start]=value;
		
	}
	Prim(graph,node_num,dist,parent);
	 
	return 0;
}
/*输入样例
7 12
0 1 2
0 2 4
2 5 5
5 6 1
6 4 6
4 1 10
3 0 1
3 1 3
3 4 7
3 6 4
3 5 8
3 2 2

*/
  • 运行结果
    最小生成树之Prim算法C语言_第3张图片

解释一下结果:parent[i]代表结点i的根结点
parent[0]=-1,说明结点0是根结点
parent[1]=-1,parent[3]=-1说明结点1和3的根结点是结点0

这样就构成一棵最小生成树了

你可能感兴趣的:(数据结构与算法)