#include <bits/stdc++.h>
#define VSIZE 100
using namespace std;
typedef int VType;
typedef struct ENode{ //边链表结点
int v;//定义下标
struct ENode *next;//下一个顶点的指针
}ENode;
typedef struct VNode{ //顶点的结点
VType data; //顶点中数据
ENode *first; //第个边链表的指针
}VNode;
typedef struct AdjMGraph{
VNode vexs[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]);
g->vexs[i].first =NULL;
}
printf("输入哪个顶点之间有边\n");
for(int i = 0;i < g->ENum;i++){
int n,m;;
scanf("%d %d",&n,&m);
ENode *p = (ENode *)malloc(sizeof(ENode));
p->v = m-1;
p->next = g->vexs[n-1].first;
g->vexs[n-1].first = p;
p->v = n-1;
p->next = g->vexs[m-1].first;
g->vexs[m-1].first = p;
}
}
void BFStraverse(AdjMGraph g)
{
int visited[VSIZE];
queue<int> a;//定义一个队
memset(visited,0,sizeof(visited)); //0表示没有被访问过,1表示被访问过
for(int i = 0;i < g.VNum;i++){ //每一个顶点都要判断一下
if(visited[i] == 0){ //表示没有被访问过
visited[i] = 1;//表示这个顶点已经被访问了
a.push(i); //以这个没有被访问的点 继续批
printf("%d\n",g.vexs[i].data);
while(!a.empty()){
int k = a.front(); //获取当前队头
ENode *p = g.vexs[k].first;
a.pop(); //去掉队头
while(p){
if(visited[p->v] == 0){ //没有被访问过
visited[p->v] = 1;
printf("%d\n",g.vexs[p->v].data);
a.push(p->v); //表示没有访问,进入队列
}
p = p->next;
}
}
}
}
}
int main()
{
AdjMGraph g; //定义邻接表图
createGraph(&g); //创建邻接表图
BFStraverse(g); //图的广度的优先搜索
return 0;
}
图的邻接表广度优先搜索
猜你喜欢
转载自blog.csdn.net/weixin_42868863/article/details/88960491
今日推荐
周排行