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.
相关文章推荐
- 合并两个排序链表(LintCode)
- 利用c语言求出0~999之间的所有“水仙花数”并输出
- 用c语言输出菱形(13行)
- BZOJ1083繁忙的都市
- c语言小程序:编写猜字游戏
- 用c语言模拟用户登录,并且只能登录三次
- c++单链表基本操作
- c++学习笔记(十六):函数模板
- c语言学习第三课:条件分支结构
- C++11 新特性:Lambda 表达式
- C++11学习笔记1---序
- Effective C++ 条款23
- LeetCode之Generate Parentheses(C++)
- C++11中的智能指针
- C#联调C++项目
- C++的Name lookup之qualified name lookup
- c#调用c++dll方案总结
- C++中使用引用作为函数参数的优点
- C++宏定义详解
- C语言break,continue和return的区别