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号