图的邻接矩阵创建,深广度遍历,最小生成树一次性C++语言编写

这是一个C++程序,用于创建图、进行深度和广度优先搜索遍历,并使用普里姆算法求解最小生成树。程序首先通过邻接矩阵存储图,然后进行DFS和BFS遍历,最后输出最小生成树的边。适用于C++初学者,通过实例展示了图的算法应用。
摘要由CSDN通过智能技术生成

已经过Visual Studio DevC++验证,可直接运行,利用了队列和普里姆算法相关知识,难度较低,对新手友好!!!

一、实验目的
    1.复习 C++中的全局变量的概念。
    2.掌握图的邻接矩阵和邻接表两种存储方式及实现。
    3.熟悉图的构造算法,了解实际问题的求解效率与采用何种存储结构与算法有着
密切联系。
    4.掌握图的 BFS 和 DFS 两种遍历方式的实现算法。
    5.理解图的求最小生成树的普里姆算法和克鲁斯卡尔算法的实现。
    6.利用图的知识解决实际问题。
二、实验内容和要求
    1.创建给定的图,从邻接表和邻接矩阵两种存储方式中选择一种。
    2.对所创建的图进行深度和广度优先搜索遍历,给出遍历过程中的顶点序列。
    3.(可选题)对所创建的图求出最小生成树,输出构成最小生成树的所有边。
    4.编写一个主函数,将上面函数连在一起,构成一个完整程序。
    5.将实验源程序调试并运行。
    6.调试并运行实验源程序。

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define MAX 100
#define ENDLESS 999
using namespace std;
typedef char ElemType;
typedef int Status;

Status visited[MAX];

//先定义,后声明 
typedef struct TNode
{
	ElemType vex[MAX];
	Status arc[MAX][MAX];
	Status Vexnum,Edgenum;
}MGraph;

typedef struct
{
	Status data[MAX];
	Status front,rear;
	
}Queue;


void Prim(MGraph G);
void InitQueue(Queue *Q);
void EnQueue(Queue *Q, int e);
int QueueEmpty(Queue *Q);
void DeQueue(Queue *Q, int *e);
void CreateGraph(MGraph &G);
void DFS(MGraph G, int i);
void TraverGraph(MGraph G);
void BFS(MGraph *G);

int main()
{
	MGraph G;
	CreateGraph(G);
	cout<<endl<<"图的深度优先遍历为:"<<endl;
	TraverGraph(G);
	cout<<endl<<"图的广度优先遍历为:"<<endl;
	BFS(&G);
	cout<<endl<<"最小生成树为:"<<endl;
	Prim(G);
	return 0;
}

void Prim(MGraph G)
{
	int min,i,j,k;
	int adjvex[MAX];
	int lowcost[MAX];
	adjvex[0]=0;
	lowcost[0]=0;
	for(i=1; i<G.Vexnum; i++)
	{
		lowcost[i]=G.arc[0][i];
		adjvex[i]=0;
	}
	for(i=1; i<G.Vexnum; i++)
	{
		min=ENDLESS;
		j=1;
		k=0;
		while(j<G.Vexnum)
		{
			if(lowcost[j]!=0 && lowcost[j]<min)
			{
				min=lowcost[j];
				k=j;
			}
			j++;
		}
		cout<<adjvex[k]+1<<"-->"<<k+1<<endl;
		lowcost[k]=0;
		for(j=1; j<G.Vexnum; j++)
		{
			if(lowcost[j] != 0  && G.arc[k][j]< lowcost[j])
			{
				lowcost[j]=G.arc[k][j];
				adjvex[j]=k;
			}
		}
	}
}

void InitQueue(Queue *Q)
{
	Q->front=Q->rear=0;
}

void EnQueue(Queue *Q, int e)
{
	if((Q->rear+1)%MAX==Q->front) return;
	Q->data[Q->rear]=e;
	Q->rear=(Q->rear+1)%MAX;
}

int QueueEmpty(Queue *Q)
{
	if(Q->front==Q->rear) return 1;
	else return 0;
}

void DeQueue(Queue *Q, int *e)
{
	if(Q->front==Q->rear) return;
	*e=Q->data[Q->front];
	Q->front=(Q->front+1)%MAX;
}

void CreateGraph(MGraph &G)
{
	cout<<"输入顶点与边的个数:"<<endl;
	cin>>G.Vexnum>>G.Edgenum;
	getchar();
	cout<<"输入顶点的数值:"<<endl;
	for(int i=0; i<G.Vexnum; i++)
	{
		cin>>G.vex[i];
		getchar();
		
	}
	for(int i=0; i<G.Vexnum; i++)
	{
		for(int j=0; j<G.Vexnum; j++)
		{
			G.arc[i][j]=ENDLESS;
		}
	}
	int x,y,w;
	cout<<"输入邻接矩阵对应的下标(0开始)以及对应边的权重:"<<endl;
	for(int i=0; i<G.Edgenum; i++)
	{
		cin>>x>>y>>w;
		G.arc[x][y]=w;
		G.arc[y][x]=G.arc[x][y];
	}
	
}

void DFS(MGraph G, int i)
{
	visited[i]=1;
	cout<<G.vex[i]<<" ";
	for(int j=0; j<G.Vexnum; j++)
	{
		if(!visited[j] && G.arc[i][j]!= ENDLESS)
		{
			DFS(G,j);
		}
	}
}

void TraverGraph(MGraph G)
{
	for(int i=0; i<G.Vexnum; i++)
	{
		visited[i]=0;
	}
	for(int j=0; j<G.Vexnum; j++)
	{
		if(!visited[j])
		{
			DFS(G,j);
		}
	}
}

void BFS(MGraph *G)
{
	int i,j;
	Queue Q;
	for(i=0; i<G->Vexnum; i++)
	{
		visited[i]=0;
	}
	InitQueue(&Q);
	for(i=0; i<G->Vexnum; i++)
	{
		if(!visited[i])
		{
			visited[i]=1;
			cout<<G->vex[i]<<" ";
			EnQueue(&Q,i);
			while(!QueueEmpty(&Q))
			{
				DeQueue(&Q,&i);
				for(j=0; j<G->Vexnum; j++)
				{
					if(!visited[j] && G->arc[i][j]!=ENDLESS)
					{
						visited[j]=1;
						cout<<G->vex[j]<<" ";
						EnQueue(&Q,j);
					}
				}
			}
		}
	 } 
}

运行结果:

 

 

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值