已经过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);
}
}
}
}
}
}
运行结果: