图的邻接矩阵广度优先搜素

#include <bits/stdc++.h>
#include <queue>
#define VSIZE 100
using namespace std;
typedef int VType;            //顶点数据类型 
typedef int EType;            //边的数据类型 
typedef struct AdjMGraph{
	VType vexs[VSIZE];        //顶点数组
	EType arc[VSIZE][VSIZE];  //边的数组
	int VNum;                 //顶点个数
	int ENum;                 //边的个数 
}AdjMGraph;                  
void createGraph(AdjMGraph *g)
{
	printf("输入顶点个数\n");
	scanf("%d",&g->VNum);
	printf("输入边的个数\n");
	scanf("%d",&g->ENum);
	
	printf("输入每个顶点的值\n");
	for(int i = 0;i < g->VNum;i++){
		scanf("%d",&g->vexs[i]);
	}
	memset(g->arc,0,sizeof(g->arc));  //0则表示没有相连 
	printf("输入两个相连的顶点\n");
	for(int i = 0;i < g->ENum;i++){
		int p,q;
		scanf("%d %d",&p,&q);
		g->arc[p-1][q-1] = 1;   // 为了使两个相连的的顶点为1 
		g->arc[q-1][p-1] = 1;   //
	}
}
void BFStraverse(AdjMGraph g)
{
	queue<int> a;             //定义一个队列 
	int visited[VSIZE]; 
	memset(visited,0,sizeof(visited));   //0表示没有被访问过,1则表示被访问过 
	for(int i = 0;i < g.VNum;i++){       //每一个顶点都要判断一下 
		if(visited[i] == 0){            //表示没有被访问过 
			printf("%d\n",g.vexs[i]);
			a.push(i);                  //进入队列,可以按照这个点往四周找 
			visited[i] = 1;             //表示这个点已经被访问过了 
			while(!a.empty()){          
				int k = a.front();      
				a.pop();                //出队列 
				for(int j = 0;j < g.VNum;j++){
					if(visited[j] == 0 && g.arc[k][j] == 1){
						a.push(j);     //没有被访问过,就进入队列 
						visited[j] = 1;//表示已经被访问过 
						printf("%d\n",g.vexs[j]);
					}
				}
			}
		}
	}
}

int main()
{
	AdjMGraph g;
	createGraph(&g);          //创建邻接矩阵图 
	BFStraverse(g);           //邻接矩阵图的遍历 
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42868863/article/details/88958772