无向图遍历
大神:https://www.jianshu.com/p/e58665864d54
DFS
依次输入无向图的顶点个数、边的总条数以及每一条边,如0 1则表示顶点A和顶点B之间有边,然后创建该图的邻接矩阵的存储结构。请补充算法,对该图进行深度优先遍历,输出其遍历结果。
输入:6 11
0 1 0 5 1 5 0 3 5 3 0 2 2 3 5 4 3 4 0 4 2 4
输出:ABFDCE
1 #include<iostream> 2 using namespace std; 3 #define UNVISITED 0 4 #define VISITED 1 5 6 class AdjMatrixUndirGraph 7 { 8 public: 9 int vexNum, edgeNum; // 顶点个数和边数 10 int **Matrix; // 邻接矩阵 11 char *elems; // 顶点数据 12 bool *tag; 13 14 AdjMatrixUndirGraph(char es[], int vertexNum); 15 int FirstAdjVex(int v) ; // 返回顶点v的第一个邻接点 16 int NextAdjVex(int v1, int v2); // 返回顶点v1的相对于v2的下一个邻接点 17 void Display(); // 图的输出 18 void DFS(int v); // 深度遍历 19 }; 20 21 AdjMatrixUndirGraph::AdjMatrixUndirGraph(char es[], int vertexNum) 22 { 23 vexNum = vertexNum; 24 edgeNum = 0; 25 elems = new char[vexNum]; 26 int u, v; 27 for(v = 0; v < vexNum; v++) 28 { // 初始化标志数组 29 elems[v] = es[v]; 30 } 31 32 tag = new bool[vexNum]; // 生成标志数组 33 for(v = 0; v < vexNum; v++) 34 { // 初始化标志数组 35 tag[v] = UNVISITED; 36 } 37 38 Matrix = (int **)new int *[vexNum];// 生成邻接矩阵 39 for (v = 0; v < vexNum; v++) 40 { // 生成邻接矩阵的行 41 Matrix[v] = new int[vexNum]; 42 } 43 44 for (u = 0; u < vexNum; u++) 45 { 46 for (v = 0; v < vexNum; v++) 47 { // 为邻接矩阵元素赋值 48 Matrix[u][v] = 0; 49 } 50 } 51 } 52 53 int AdjMatrixUndirGraph::FirstAdjVex(int v) 54 // 操作结果:返回顶点v的第1个邻接点 55 { 56 int k; 57 for(k=0;k<vexNum;k++){ 58 if(Matrix[v][k]==1&&tag[k]==UNVISITED){ 59 return k; 60 } 61 } 62 return -1; // 返回-1表示无邻接点 63 } 64 65 int AdjMatrixUndirGraph::NextAdjVex(int v1, int v2) 66 // 操作结果:返回顶点v1的相对于v2的下1个邻接点 67 { 68 int k; 69 for(k=v2+1;k<vexNum;k++){ 70 if(Matrix[v1][k]==1&&tag[k]==UNVISITED){ 71 return k; 72 } 73 } 74 return -1; // 返回-1表示无邻接点 75 } 76 77 void AdjMatrixUndirGraph::Display() 78 { 79 int i,j; 80 for(i=0;i<vexNum;i++){ 81 for(j=0;j<vexNum;j++){ 82 cout<<Matrix[i][j]<<" "; 83 } 84 cout<<endl; 85 } 86 } 87 88 void AdjMatrixUndirGraph::DFS(int v) 89 { int w;//返回的是对应的数字 而不是顶点信息(ABCD啥的) 90 cout<<elems[v]; 91 tag[v]=1; 92 w=FirstAdjVex(v);//找到v的第一个临界点 找不到的话返回-1 93 while(w!=-1){ 94 DFS(w); 95 w=NextAdjVex(v,w); 96 } 97 98 } 99 100 int main() 101 { 102 char vexs[] = {'A', 'B', 'C', 'D','E','F','G','H','I','J','K','L', 103 'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'}; 104 int n,t,i,x,y; 105 cout<<"请输入无向图的顶点个数:"; 106 cin>>n; 107 AdjMatrixUndirGraph g(vexs, n);//新建完毕 108 109 cout<<"请输入边的总条数:"; 110 cin>>t; 111 cout<<"请依次输入边,如0 1表示A和B之间有边:"<<endl; 112 for (i = 1; i <=t; i++) 113 { 114 cin>>x>>y; 115 g.Matrix[x][y]= g.Matrix[y][x]= 1; 116 } 117 118 cout << endl <<"原无向连通图的邻接矩阵如下:" << endl; 119 g.Display(); 120 cout << endl; 121 122 cout << "深度遍历序列为:" << endl; 123 g.DFS(0); 124 cout<<endl; 125 126 return 0; 127 }
BFS
有错误还没改不知道哪里出了问题
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define MAX_NUM 100 4 typedef struct Graph{ 5 char vexnum,arcnum;//顶点数,边数 6 char vertex[MAX_NUM];//顶点信息数组 7 int arcs[MAX_NUM][MAX_NUM];//邻接数组 8 }Graph; 9 bool visited[MAX_NUM]; 10 typedef struct{ 11 int data[MAX_NUM];//顺序队列 这是队列的元素空间 12 int front;//头指针指示器 13 int rear;//尾指针 注意啊这是int类型的 14 }Queue; 15 void InitQueue(Queue *Q){ //初始化队列 16 17 Q->front=Q->rear=0; 18 } 19 void EnterQueue(Queue *Q,int e){ 20 int x; 21 /* 22 if((Q->rear+1)%MAX_NUM==Q->front){ 23 return false; 24 }*/ 25 Q->data[Q->rear]=x; 26 Q->rear=(Q->rear+1)%MAX_NUM; 27 28 } 29 void DeleteQueue(Queue *Q,int *x){ 30 31 *x=Q->data[Q->front]; 32 Q->front=(Q->front+1)%MAX_NUM; 33 34 } 35 int Empty(Queue Q){ 36 37 if(Q.front==Q.rear){ 38 return 1;//队列为空 返回真 39 } 40 else{ return 0;} 41 42 } 43 void CreateGraph(Graph *g){ 44 int i,j; 45 int u,v;//输入的边的信息 46 47 cout<<"输入顶点数和边数"<<endl; 48 cin>>g->vexnum>>g->arcnum; 49 for(i=0;i<g->vexnum;i++){ 50 visited[i]=false;//初始化判断数组都为false 所有点都未访问 51 } 52 cout<<"输入顶点信息数组"<<endl; 53 for(i=0;i<g->vexnum;i++){ 54 cin>>g->vertex[i];//可以输入ABCDE了 55 } 56 //对邻接矩阵的 初始化 和有联系的点的信息化 57 for(i=0;i<g->vexnum;i++){ 58 for(j=0;j<g->vexnum;j++){ 59 g->arcs[i][j]=0;//初始化邻接矩阵啦 60 } 61 } 62 for(j=0;j<g->arcnum;j++){ 63 cout<<"请依次输入边,如0 1 表示A和B之间有边"<<endl; 64 cin>>u>>v; 65 g->arcs[u][v]=1; 66 g->arcs[v][u]=1;//这样就联系起来啦 输入有联系的边的信息了 67 } 68 } 69 int FirstVertex(Graph g,int v){//int类型哦 70 71 int k=0; 72 for(k=0;k<g.vexnum;k++){ 73 if(g.arcs[v][k]==1&&visited[k]==false){ 74 return k; 75 } 76 } 77 return -1; 78 } 79 int NextVertex(Graph g,int v1,int v2){ 80 81 int k; 82 for(k=v2+1;k<g.vexnum;k++){ 83 if(g.arcs[v1][k]==1&&visited[k]==false){ 84 return k; 85 } 86 } 87 return -1; 88 } 89 void BreadthFirstSearch(Graph *g,int v0){ //bfs遍历 90 Queue Q; 91 int v,i; 92 visited[v0]=true; 93 cout<<g->vertex[v0]<<" "; 94 InitQueue(&Q);//初始化队列 95 EnterQueue(&Q,v0);//向队列中插入元素 96 /*while(!Empty(Q)){//为空返回真 此条件是判断队列不为空 97 DeleteQueue(&Q,&v);//队首元素v出队 98 w=FirstVertex(g,v); 99 while(w!=-1){ 100 if(!visited[w]){ 101 visited[w]=1; 102 EnterQueue(&Q,W); 103 } 104 w=NextVertex(g,v,w); 105 } 106 }*/ 107 while(!Empty(Q)){ 108 DeleteQueue(&Q,&v); 109 for(i=0;i<g->vexnum;i++){ 110 if(g->arcs[v][i]==1&&visited[i]==false){ 111 visited[i]=true; 112 cout<<g->vertex[i]<<" "; 113 EnterQueue(&Q,i); 114 } 115 } 116 } 117 } 118 //操作的是数字 输出的时候让数字对应vertex[]数组 vertex[0]=A 119 void ShowGraph(Graph *g){ 120 cout<<"输出图的信息"<<endl; 121 int i,j; 122 for(i=0;i<g->vexnum;i++){ 123 for(j=0;j<g->vexnum;j++){ 124 cout<<g->arcs[i][j]<<" "; 125 } 126 cout<<endl; 127 } 128 } 129 130 int main(){ 131 132 Graph *g; 133 int i; 134 g=(Graph*)malloc(sizeof(Graph)); 135 CreateGraph(g); 136 for(i=0;i<g->vexnum;i++){ 137 BreadthFirstSearch(g,i); 138 cout<<endl; 139 } 140 ShowGraph(g); 141 }