您的位置:首页 > 编程语言 > C语言/C++

C++邻接矩阵创建图及深度、广度遍历

2015-10-27 19:20 459 查看
#include "stdafx.h"
#include<iostream>
#include<queue>
using namespace std;
#define VERTEX_MAX 26   //图的最大顶点数
#define MAXVALUE 32767 //最大值(可设为一个最大整数)
typedef struct //定义邻接矩阵图结构
{
char Vertex[VERTEX_MAX]; //保存顶点信息(序号或字母)
int Edges[VERTEX_MAX][VERTEX_MAX]; //保存边的权
int isTrav[VERTEX_MAX]; //遍历标志
int VertexNum; //顶点数量
int EdgeNum;//边数量
int GraphType; //图的类型(0:无向图,1:有向图)
}MatrixGraph;

void CreateMatrixGraph(MatrixGraph *G)//创建邻接矩阵图
{
int i, j, k, weight;
char start, end; //边的起始顶点
for (i = 0; i < G->VertexNum; i++)  //清空矩阵
{
for (j = 0; j < G->VertexNum; j++)
G->Edges[i][j] = MAXVALUE; //设置矩阵中各元素的值为最大值
}
cout << "输入各顶点信息\n";
for (i = 0; i<G->VertexNum; i++) //输入顶点
{
printf("第%d个顶点:", i + 1);
cin >> G->Vertex[i] ; //保存到各顶点数组元素中
}
printf("输入构成各边的两个顶点及权值:\n");
for (k = 0; k<G->EdgeNum; k++)  //输入边的信息
{
printf("第%d条边:", k + 1);
cin >> start >> end >> weight;
for (i = 0; start != G->Vertex[i]; i++); //在已有顶点中查找始点
{
for (j = 0; end != G->Vertex[j]; j++); //在已有顶点中查找结终点
{
G->Edges[i][j] = weight; //对应位置保存权值,表示有一条边
if (G->GraphType == 0)  //若是无向图
{
G->Edges[j][i] = weight;//在对角位置保存权值
}
}
}
}
}

void OutMatrix(MatrixGraph *G)//输出邻接矩阵
{
int i, j;
for (j = 0; j<G->VertexNum; j++)
printf("\t%c", G->Vertex[j]);          //在第1行输出顶点信息
printf("\n");
for (i = 0; i<G->VertexNum; i++)
{
printf("%c", G->Vertex[i]);
for (j = 0; j<G->VertexNum; j++)
{
if (G->Edges[i][j] == MAXVALUE) //若权值为最大值
printf("\t∞");          //输出无穷大符号
else
printf("\t%d", G->Edges[i][j]); //输出边的权值
}
printf("\n");
}
}

void BFSfunction(MatrixGraph *G, int i)//广度优先遍历
{
int  j ;
queue<int> Q;
G->isTrav[i] = 1 ;//表示这个顶点已经被遍历过了
cout <<"->"<< G->Vertex[i] ;//输出第一个顶点
Q.push(i);	//入队列
while (!Q.empty())
{
Q.pop();
for (j = 0; j < G->VertexNum; j++)
{
if (G->Edges[i][j] != MAXVALUE && !G->isTrav[j])
{
cout << "->" << G->Vertex[j];
G->isTrav[j] = 1;
Q.push(j);
}
}
}
}
void BFSTraverse(MatrixGraph *G)//广度优先
{
int i;
for (i = 0; i < G->VertexNum; i++)	//表示其它顶点为被遍历
G->isTrav[i] = 0;
for (i = 0; i < G->VertexNum; i++)
{
if (!G->isTrav[i])	//若未被遍历
BFSfunction(G, i);//遍历一下
}
}
void DFSfunction(MatrixGraph *G, int i)//深度遍历函数
{
int j = 0;
G->isTrav[i] = 1;//标记该顶点已经被遍历过
cout << "->" << G->Vertex[i];//输出第一个遍历的顶点信息
for (j = 0; j < G->VertexNum; j++)//循环遍历其它顶点
{
if (G->Edges[i][j] != MAXVALUE && !G->isTrav[i])//该结点有相连的其它顶点且未被遍历且
{
DFSfunction(G, j);
}
}
}
void DFSTraverse(MatrixGraph *G)//深度优先遍历
{
int i;
for (i = 0; i < G->VertexNum; i++)//表示各顶点还没有被遍历
{
G->isTrav[i] = 0;
}
for (i = 0; i < G->VertexNum; i++)
{
if (!G->isTrav[i])//若未被遍历
DFSfunction(G, i);//遍历一下
}
cout << '\n';
}

int _tmain(int argc, _TCHAR* argv[])
{
MatrixGraph G; //定义保存邻接矩阵结构的图
int i, j;
cout << "输入生成图的类型(0:无向图,1:有向图):\n";
cin >> G.GraphType;//图的种类
cout << "输入图的顶点数量和边数量:\n";
cin >> G.VertexNum >> G.EdgeNum;//输入图顶点数和边数

CreateMatrixGraph(&G); //创建用邻接表保存的图
printf("邻接矩阵数据如下:\n");
OutMatrix(&G);
cout << "深度优先遍历结点:";
DFSTraverse(&G);
cout << "广度优先遍历结点:";
BFSTraverse(&G);
cout << endl;
system("pause");
return 0;
}

IDE是vs2013.

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: