GraphBasicOperation.cpp文件鏈接:https://blog.csdn.net/qq_16261421/article/details/106005857
深度優先搜索遍歷的過程是:
(1)從圖中某個初始頂點v出發,首先訪問初始頂點v。
(2)選擇一個與頂點v相鄰且沒被訪問過的頂點w爲初始頂點,再從w出發進行深度優先搜索,直到圖中與當前頂點v鄰接的所有頂點都被訪問過爲止。
#include "GraphBasicOperation.cpp"
void BFS(ALGraph *G,int v)
{
ArcNode *p;
int queue[MAXV],front=0,rear=0; //定義循環隊列並初始化
int visited[MAXV]; //定義存放結點的訪問標誌的數組
int w,i;
for (i=0;i<G->n;i++) visited[i]=0; //訪問標誌數組初始化
printf("%2d",v); //輸出被訪問頂點的編號
visited[v]=1; //置已訪問標記
rear=(rear+1)%MAXV;
queue[rear]=v; //v進隊
while (front!=rear) //若隊列不空時循環
{
front=(front+1)%MAXV;
w=queue[front]; //出隊並賦給w
p=G->adjlist[w].firstarc; //找與頂點w鄰接的第一個頂點
while (p!=NULL)
{
if (visited[p->adjvex]==0) //若當前鄰接頂點未被訪問
{
printf("%2d",p->adjvex); //訪問相鄰頂點
visited[p->adjvex]=1; //置該頂點已被訪問的標誌
rear=(rear+1)%MAXV; //該頂點進隊
queue[rear]=p->adjvex;
}
p=p->nextarc; //找下一個鄰接頂點
}
}
printf("\n");
}
void main()
{
int i,j;
MGraph g;
ALGraph *G;
int A[MAXV][5]={
{0,1,0,1,1},
{1,0,1,1,0},
{0,1,0,1,1},
{1,1,1,0,1},
{1,0,1,1,0}};
g.n=5;g.e=16;
for (i=0;i<g.n;i++)
for (j=0;j<g.n;j++)
g.edges[i][j]=A[i][j];
G=(ALGraph *)malloc(sizeof(ALGraph));
MatToList(g,G);
printf(" 鄰接表:\n");DispAdj(G);
printf("廣度優先序列:");BFS(G,2);printf("\n");
}