C++中普里姆算法的应用
代码展示
#define MAX 5000
#include"stdio.h"
#include< stdlib.h >
#pragma warning(disable : 4996)
typedef struct
{
	int fromvex;    /*边的起始点*/
	int endvex;     /*边的终止点*/
	int weight;     /*边的权值*/
}g;
g tree[20] = { 0 }, GE[20] = { 0 }, TREE[20] = { 0 }, t;
int edge[20][20], s[20][20] = { 0 };
int n, m;
void createmat()    /*建立无向网邻接矩阵*/
{
	int i, j, w, k, e;
	printf("输入顶点数和边数:");
	scanf("%d%d", &n, &e);
	for (i = 0; i < n; i++)
		for (j = 0; j < n; j++)
			edge[i][j] = MAX;
	for (k = 1; k <= e; k++)
	{
		printf("输入 NO.%3d 边的起点,终点和权值:", k);
		scanf("%d%d%d", &i, &j, &w);
		edge[i][j] = w;
		edge[j][i] = w;
	}
}
void prim()  /*普里曼算法*/
{
	int j, k, v, d, m, min, max = 5000;
	g e;
	for (j = 0; j < n - 1; j++)   /*生成树初始化*/
	{
		tree[j].fromvex = 0;
		tree[j].endvex = j + 1;
		tree[j].weight = edge[0][j + 1];
	}
	//for (j = 0; j < n - 1; j++)
		//printf("%3d%3d%3d\n", tree[j].fromvex, tree[j].endvex, tree[j].weight);
	//getch();
	for (k = 0; k < n - 1; k++)  /*求组成最小生成树的n-1条边中第k条边*/
	{
		min = max;
		for (j = k; j < n - 1; j++)   /*在候选边中找最小边*/
			if (tree[j].weight < min)
			{
				min = tree[j].weight;
				m = j;  /*最小边序号在m中*/
			}
		e = tree[m];    /*最小边依次转移到最前面*/
		tree[m] = tree[k];
		tree[k] = e;
		v = tree[k].endvex;   /*是树中下一个新结点*/
		for (j = k + 1; j < n - 1; j++)    /*边的调整*/
		{
			d = edge[v][tree[j].endvex];
			if (d < tree[j].weight)
			{
				tree[j].weight = d;
				tree[j].fromvex = v;
			}
		}
	}
	printf("输出的最小生成树为:\n");
	for (j = 0; j < n - 1; ++j)   /*输出最小生成树*/
		printf("边:%5d  ->%3d 权值:%5d\n", tree[j].fromvex, tree[j].endvex, tree[j].weight);
}
int main()
{
	while (1)
	{
		int choice;
		system("cls");
		printf("顶点请用从零开始的连续整数表示,权值请小于100");
		printf("\n\n\n");
		printf("          *****>主菜单<*****\n\n\n");
		printf("           1----------普你姆算法\n");
		printf("           0----------退出程序\n");
		printf("\n\n enter your choice :");
		scanf("%d", &choice);
		if (choice < 0 || choice>3)
			return(0);
		switch (choice)
		{
		case 1:
			createmat();
			prim();
			system("pause");
			break;
		case 0:
			exit(0);
		}
	}
}
    专心看人间!
                    
                
                
            
        
浙公网安备 33010602011771号