#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
今日推荐
周排行