prim.cpp

来自「数据结构学习过程中的实验 PRIM算法」· C++ 代码 · 共 128 行

CPP
128
字号
#include <iostream>
#include <stdio.h>
using namespace std;

#define NO 100	//设最大顶点数为100
#define MAX 32767	//设32767为最大整数

struct mgraph
{
	int adjmatrix[NO+1][NO+1];//定义邻接距阵
};
struct mgraph MH;
int n, e, Q;//定义顶点数和边或弧数

void creatmgraph(int n, int e)//创建图的邻接距阵
{
	int i,j,k,t;//i为行数 ;j为列数;k为两点间距离;
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
		MH.adjmatrix[i][j]=MAX;//点与点的距离信息
	}


  if(Q==1)
	{
		cout<<"请输入无向图相关邻接距阵的信息(点、距离,输3次):"<<endl;
		for(t=1;t<=e;t++)	
		{	
			cin>>i>>j>>k;	
			cout<<"i="<<i<<"	"<<"j="<<j<<endl;	
			cout<<i<<"到"<<j<<"距离为:"<<k<<endl;		
			MH.adjmatrix[i][j]=MH.adjmatrix[j][i]=k;//点与点的距离信息		
			if(t!=e)
				cout<<"请继续输入"<<endl;
		}
	}

	else   if(Q==2)
	{
		cout<<"请输入有向相关邻接距阵的信息(点、距离,输3次):"<<endl;
		for(t=1;t<=e;t++)	
		{	
			cin>>i>>j>>k;
			cout<<"i="<<i<<"	"<<"j="<<j<<endl;	
			cout<<i<<"到"<<j<<"距离为:"<<k<<endl;		
			MH.adjmatrix[i][j]=k;//点与点的距离信息		
			if(t!=e)
				cout<<"请继续输入"<<endl;
		}
	}

}

void printMH(struct mgraph MH)
{
	int i,j;
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
			cout<<MH.adjmatrix[i][j]<<"	";
		cout<<endl<<endl;
	}
}

void prim(int x)
{
	int i,j,k;
	int mintotree[NO+1];//存放顶点i的到树中顶点最近距离
	int closet[NO+1];//存放顶点i的到树中最近距离的顶点序号
	int min = 32767;

	for(i=1;i<=n;i++)//初始化
	{
		mintotree[i] = MH.adjmatrix[i][x];
		closet[i] = x ;//邻接到X
	}

	for( i=2; i<=n; i++)
	{
		k=0;
		min=32767;
		for(j=1;j<=n;j++)
		{
			if(mintotree[j]!=0 && mintotree[j]< min)//判断与生成树的最近距离
			{
				k=j;
				min=mintotree[j];
			}
		}

		if(k==0) break; //
		mintotree[k]=0;//标记:距离为0, k进树
		for(j=1;j<=n;j++)
		{
			if(mintotree[j]!=0 && MH.adjmatrix[k][j]<mintotree[j])//判断
			{
				mintotree[j]=MH.adjmatrix[k][j];
				closet[j]=k;
			}
		}

	}
	for(j=1;j<=n;j++)
	{
		if(j!=closet[j])
			cout<<j<<"->"<<closet[j]<<"	"<<MH.adjmatrix[j][closet[j]]<<endl;
	}
}


void main()
{
	cout<<"输入图顶点数和边或弧数:"<<endl;
	cin>>n>>e;
	cout<<"无向或有向:1、无向;	2、有向"<<endl;
	cin>>Q;
	creatmgraph(n,e);//创建图的邻接距阵
	printMH(MH);
	cout<<"	PRIM算法求最小生成树"<<endl;
	cout<<"请输入任意一个顶点(1~n),开始"<<endl;
	int x;//定义任选的顶点序号
	cin>>x;
	prim(x);
}


⌨️ 快捷键说明

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