图之广度优先遍历

 例如:有一个图如下所示(该图也作为程序的实例):

《图之广度优先遍历》

广度优先搜索:

#include<iostream>
#include<queue>
using namespace std;
#define INFINITY 65535
struct MGraph
{
	char V[10];
	int Edge[10][10];
	int Vexnum;
	int Edgenum;
};
void CreateGraph(MGraph *G)  //初始化邻接矩阵
{  
    printf("请输入顶点数和边数:");  
    scanf("%d%d",&(G->Vexnum),&(G->Edgenum));  
    char c;  
    c=getchar();  
    int i,j;  
    for(i=0;i<G->Vexnum;i++)  
        for(j=0;j<G->Vexnum;j++)  
            G->Edge[i][j]=INFINITY;  
  
    printf("请输入顶点信息(char)型\n");  
    for(i=0;i<G->Vexnum;i++)  
        scanf("%c",&(G->V[i]));  
    c=getchar();  
    int w=1;  
    for(int k=0;k<G->Edgenum;k++)  
    {  
        printf("请输入(vi,vj)的下标i,j:");  
        scanf("%d%d",&i,&j);  
        c=getchar();  
        G->Edge[i][j]=w;  
        G->Edge[j][i]=w;  
    }  
  
}  
queue<int>q;
void Enqueue(int i)
{
	q.push(i);
}
int Dequeue()
{
	return q.front();
}

void bfs(MGraph *G)
{
	
	int visited[10]={0};

	for(int i=0;i<G->Vexnum;i++)//如果是连通图则不需要遍历每个点做起点
	{
		if(!visited[i])
		{
			visited[i]=1;
			printf("%c",G->V[i]);
			Enqueue(i);//该店没访问过,入栈
			while(!q.empty())
			{
				int x=Dequeue();
				q.pop();
				for(int j=0;j<G->Vexnum;j++)
				{
					if(G->Edge[x][j]==1&&visited[j]==0)
					{
						visited[j]=1;
						printf("%c",G->V[j]);
						Enqueue(j);
					}
				}
			}
		}

	}

}

void main()
{
	MGraph G;
	CreateGraph(&G);
	bfs(&G);
}

《图之广度优先遍历》

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/steph_curry/article/details/78937730
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞