实现Prim算法

#include<stdio.h>code

#include<stdlib.h>element

#define Max 10get

typedef char elementType;it

//定义图顶点相关的内容io

typedef struct Graph_g {im

elementType peek[Max];

int number_vertex;//定义顶点个数

int nubmer_edge;//定义边的个数

int G[Max][Max];//定义临接矩阵

bool c[Max];

}Graph, *Graph_matrax;集合

//对图进行初始化di

Graph_matrax init() {co

Graph_matrax  graph = (Graph_matrax)malloc(sizeof(Graph));

int vertex;

printf("请输入顶点的个数\n");

scanf("%d", &vertex);

graph->number_vertex = vertex;

graph->nubmer_edge = 0;

int i;

//对顶点的信息进行赋值

for (i = 0; i < vertex; i++)
{
	getchar();
	
	char c;
	
	printf("请输入%d个顶点的信息:", i + 1);
	
	scanf("%c", &c);
	
	graph->peek[i] = c;
	
}


//临接矩阵的对脚线赋值为0,其余的初始化为最大值,假设全都不连通

for (int i = 0; i < graph->number_vertex; i++) {

	for (int j = 0; j < graph->number_vertex; j++)
	
	{
		if (i == j)
		
			graph->G[i][j] = 0;
			
		else
			graph->G[i][j] = 8888;
	}
}

int edge = 0;

int v1, v2, w;

printf("请输入边的数目:");

scanf("%d", &edge);

for (i = 0; i < edge; i++) {

	printf("请输入i,j,w,有关顶点的到顶点的边的相关信息:");
	
	scanf("%d%d%d", &v1, &v2, &w);
	
	graph->G[v1 - 1][v2 - 1] = w;
	
	graph->G[v2 - 1][v1 - 1] = w;
	
}

return graph;

}display

void display(Graph_matrax g) {

printf("输出临接矩阵:\n");

for (int i = 0; i < g->number_vertex; i++) {

	for (int j = 0; j < g->number_vertex; j++)

	{
		printf("%8d", g->G[i][j]);

	}
	printf("\n");


}

}

void Prim(Graph_matrax g, int v) {

//lowcost存储为放到集合到已经放到集合的最小值,lowcost[i]=0表示该i节点己经放到集合中了,也能够做为后面判断有环的条件

int lowcost[Max];

int close[Max];//存储谁指向本身的节点,也就是该节点的父亲

int i;

//初始化,第一个放入的节点

for (i = 0; i < g->number_vertex; i++) {

	lowcost[i] = g->G[v][i];
	
	close[i] = v;
}

int min;

int k=0;

int j;

//把另外的n-1元素作相同的操做

for (i = 1; i < g->number_vertex; i++) {

	min = 8888888;
	
	//找到还未放到集合到集合某个节点的最小权值的节点
	
	for (j = 0; j < g->number_vertex; j++) 
	
		if (lowcost[j] != 0 && min >lowcost[j]) {
		
			min = lowcost[j];
			
			k = j;
		}
	
	printf("%d->%d  权重为%d ",close[k], k,lowcost[k]);
	
	//放入到集合的元素要把权值放置为0
	
	lowcost[k] = 0;
	
	//在刚找的节点的临接点中的最小权值,与lowcost[]中的比较,小就更新
	
	for (j = 0; j < g->number_vertex; j++) {
	
		if (g->G[k][j] != 0 && g->G[k][j] < lowcost[j]) {
		
			lowcost[j] = g->G[k][j];
			
			//把父亲节点存入进去
			
			close[j] = k;
		}
	}
	printf("\n");

}

}

int main() {

Graph_g *g = init();

printf("%d\n", g->number_vertex);

display(g);

printf("\n");

//为了不出现错误,把c[]所有设为false

Prim(g, 0);

printf("\n");

system("pause");
return 0;

}

相关文章
相关标签/搜索