图的广度优先搜索可以用来解决很多问题,例如可以用于产生图的生成树。程序代码在VC++6.0和Dev-C++下编译通过。
算法的输入和输出为:
#include "stdio.h"
#include "stdlib.h"
#include <queue>
using namespace std;
#define MAX_VERTEX_NUM 100
typedef int AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct { // 图的定义
char vexs[MAX_VERTEX_NUM];
AdjMatrix arcs; // 弧的信息
int vexnum, arcnum; // 顶点数,弧数
} MGraph;
queue <int> q;
void InitQueue(queue <int> &q)
{
while(!q.empty())
q.pop();
}
void EnQueue(queue <int> &q, int v)
{
q.push(v);
}
int QueueEmpty(queue <int> q)
{
return q.empty();
}
void DeQueue(queue <int> &q, int &v)
{
v=q.front();
q.pop();
}
void BFSTraverse(MGraph g)
{
int visited[100];
int v,u,w;
for (v=0; v<g.vexnum; ++v)
visited[v] = 0; //初始化访问标志
InitQueue(q); // 置空辅助队列Q
for(v=0; v<g.vexnum; ++v)
if ( !visited[v])// v 尚未访问
{
visited[v] = 1;
EnQueue(q, v); // v入队列
while (!QueueEmpty(q))
{
DeQueue(q, u); // 队头元素出队并置为u
for(w=0;w<g.vexnum;w++)
{
if( g.arcs[u][w] && !visited[w])
{
visited[w]=1;
EnQueue(q, w); // 访问的顶点w入队列
printf("边(%c--%c)\n",g.vexs[u],g.vexs[w]);
}
}
} // while
}
} // BFSTraverse
int getIndex(char name, MGraph g)
{
int i;
for(i=0;i<g.vexnum;i++)
if(g.vexs[i]==name)
return i;
return -1;
}
int main()
{
int i,j,n;
char n1,n2;
MGraph g;
printf("Input number of node: ");
scanf("%d",&n);
g.vexnum=n;
for(i=0;i<n;i++)
{
printf("node (%d)= ",i);
fflush(stdin);
scanf("%c",&(g.vexs[i]));
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
g.arcs[i][j]=0;
for(;;)
{
printf("Insert edge i-j: ");
fflush(stdin);
scanf("%c%c",&n1,&n2);
i=getIndex(n1,g);
j=getIndex(n2,g);
if(i==-1 && j==-1)
break;
g.arcs[i][j]=1;
g.arcs[j][i]=1;
}
printf("广度优先搜索产生的生成树如下:\n");
BFSTraverse(g);
printf("\n");
return 0;
}