⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kruskal.cpp

📁 This kruskal Minimum Spanning Tree!It s good for user in Coding Programming.
💻 CPP
字号:
// kruskal.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <iostream>

#define  MaxEdge    100				//最大的边的数量
#define  MaxPoint   200				//最大的点的数量

//定义边的数据类型
typedef struct  
{
	int fromvex,endvex;				//边的起点和终点
	float length;					//边的权值(实际中则是城市间的通信量)
	int  sign;						//该边是否已选择过的标志信息
}edge;

edge T[MaxEdge];					//定义最大值为100的边的数组
int  G[MaxPoint];					//判断该边的两个顶点是否在同一分量上的数组,n为顶点数

void DisplayScreen();				//显示题目的输入和输出信息
void Kruskal(int n,int e);			//用kruskal算法求最小生成树,输入为顶点数n,边数e

int main(int argc, char* argv[])
{
	//变量初始化
	int n=0;
	int e=0;
	int chChoice=1;

	while(chChoice) 
	{
		system("cls");											//DOS清屏
		DisplayScreen();										//显示题目的输入和输出信息

		//输入顶点数n和边数e
		printf("Please input the number of points:");
		scanf("%d",&n);
		printf("Please input the number of edges:");
		scanf("%d",&e);

		//用kruskal算法求最小生成树,输入为顶点数n,边数e
		Kruskal(n,e);

		printf("Do you want to continue?Please input 0/1(1-Yes,0-No):");
		scanf("%d",&chChoice);									//是否继续
	} 
	
	return 0;
}


//*********************显示题目的输入和输出信息*******************************
void DisplayScreen()
{
	printf("************************************************************\n");
	printf("***                                                      ***\n");
	printf("***                最小生成树问题                        ***\n");
	printf("***问题描述: 在n个城市之间建设通信网络,如何以最低的经济 ***\n");
	printf("***          代价建设这个通信网。                        ***\n");
	printf("***输入数据: 点(即城市)的数量n,边(城市间的有效通信链路, ***\n");
	printf("***          即通信量小于无穷)的数量e,城市间的通信量如:***\n");
	printf("***          (0,1)=12,表示:从城市0到城市1的通信量为12   ***\n");
	printf("***输出数据: 按Kruskal算法构造顺序输出生成树中各条链以及 ***\n");
	printf("***          他们的对应的通信量值。                      ***\n");
	printf("***                                                      ***\n");
	printf("************************************************************\n");
	printf("\n");
}


//**************用kruskal算法求最小生成树,输入为顶点数n,边数e***************
void Kruskal(int n,int e)
{
	int i,j,k,m,p,tempflag;
	float min;

	for (i=0;i<=n-1;i++)							//数组G置初值
	{
		G[i]=i;
	}

	for (i=0;i<=e-1;i++)							//输入边信息,注意:顶点的编号从0开始编号
	{
		printf("Please input the %d edge(such as:0 1 12):\n",i);
		scanf("%d %d %f",&T[i].fromvex,&T[i].endvex,&T[i].length); //输入时注意两个输入之间需要空格
		T[i].sign=0;
	}

	printf("Display all edges:\n");					//打印出输入的所以边信息
	for (i=0;i<=e-1;i++)
	{
		printf("(%d,%d) =%f\n",T[i].fromvex,T[i].endvex,T[i].length);
	}
	printf("\nThe Minimum Spanning Tree By Minimum Spanning Tree:\n");
	
	j=0;

	while (j<n-1)
	{
		min=10000;									//min=10000 当作无穷大
		for (i=0;i<=e-1;i++)						//寻找最短边
		{
			if (T[i].sign==0)
			{
				if (T[i].length<min)
				{
					min=T[i].length;
					k=T[i].fromvex;
					m=T[i].endvex;
					p=i;							//记录最小边的编号	
				}
			}
		}
	                                 
		if (G[k]==G[m])								//在同一分量上舍去
		{
			T[p].sign=2;
		}
		else
		{
			j++;
			tempflag=G[m];							//将顶点m的信息保存作为判断依据,因为下面可能会被改变
			for (i=0;i<n;i++)
			{				
				if (G[i]==tempflag)					//将最短边的两个顶点并入同一分量
				{
					G[i]=G[k];						
				}
			}
			T[p].sign=1;							//编号为p的边已被选择了

			//按Kruskal算法构造顺序输出生成树中各条链以及他们的对应的通信量值。
			printf("(%d,%d)=%f \n",T[p].fromvex,T[p].endvex,T[p].length);		
		}

	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -