题目描述如下:
使用邻接矩阵实现BFS:

输入
8,10
1
2
3
4
5
6
7
8
1,2
1,5
2,6
3,6
3,4
3,7
4,7
4,8
6,7
7,8
2
输出
请输入顶点数和边数:请输入顶点本身的数据:
请输入边的数据:
0 1 0 0 1 0 0 0
1 0 0 0 0 1 0 0
0 0 0 1 0 1 1 0
0 0 1 0 0 0 1 1
1 0 0 0 0 0 0 0
0 1 1 0 0 0 1 0
0 0 1 1 0 1 0 1
0 0 0 1 0 0 1 0
输入BFS遍历的起始结点:2 1 6 5 3 7 4 8
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
//#include
#define MAX_VERTICES 100 //假设图有100个顶点
#define MAX_WEIGHT 32767 //加权图(网)不邻接时为10000,但输出为“∞”
#define Maxsize 100typedef struct
{int Vertices[MAX_VERTICES]; //顶点信息的数组int AdjacencyMatrix[MAX_VERTICES][MAX_VERTICES]; //边信息的数组。int numV; //当前的顶点数int numA; //当前的边数
}AdMatrix;
typedef struct
{int *base;int front;int rear;
}CyQueue;//图的生成函数
void CreateGraph(AdMatrix *G)
{int n, e, vi, vj;printf("请输入顶点数和边数:");scanf("%d,%d", &n, &e);G->numV = n;G->numA = e;//Vertices数组的创建printf("请输入顶点本身的数据:\n");for (int i = 0; i < G->numV; i++){scanf("%d", &G->Vertices[i]);}//AdjacencyMatrix数组的建立printf("请输入边的数据:\n");for (int i = 0; i < G->numA; i++){scanf("%d,%d", &vi, &vj);G->AdjacencyMatrix[vi - 1][vj - 1] = 1;G->AdjacencyMatrix[vj - 1][vi - 1] = 1;}
}
//输出邻接矩阵的信息
void ShowGraph(AdMatrix *G)
{int i, j;for (i = 0; i < G->numV; i++){//printf("\n%d ", i + 1);for (j = 0; j < G->numV; j++){/*if (G->AdjacencyMatrix[i][j] == MAX_WEIGHT){printf("%s ", "∞");}else{printf("%d ", G->AdjacencyMatrix[i][j]);}*/printf("%d ", G->AdjacencyMatrix[i][j]);}printf("\n");}
}/*循环队列基本操作*/
void create(CyQueue *q)
{q->base=(int *)malloc(Maxsize*sizeof(int));if(!q->base){printf("Space allocation failed!\n");return;}q->front=q->rear=0;return;
}void EnQueue(CyQueue *q,int value)
{if((q->rear+1)%Maxsize==q->front){printf("Cyclic Queue is Full!\n");return;}q->base[q->rear]=value;q->rear=(q->rear+1)%Maxsize;return;
}void DeQueue(CyQueue *q,int *value)
{if(q->front==q->rear){printf("Cyclic Queue is Empty!\n");return;}*value=q->base[q->front];q->front=(q->front+1)%Maxsize;return;
}int QueueEmpty(CyQueue *q)
{if (q->front==q->rear)//队列为空返回1,不为空返回0{return 1;}return 0;
}/*广度优先遍历BFS*/
int visited[MAX_VERTICES];//定义"标志"数组为全局变量void BFS(AdMatrix *G,int i)
{int j;CyQueue q;create(&q);//1.设置起始点printf("%d ",G->Vertices[i]);//1.输出当前结点visited[i]=1;//2.将已访问的结点标志成1EnQueue(&q,i);//3.将第一个结点入队//2.由起始点开始,对后续结点进行操作while(!QueueEmpty(&q)){DeQueue(&q,&i);for(j=0;jnumV;j++){if(G->AdjacencyMatrix[i][j]==1&&visited[j]==0){printf("%d ",G->Vertices[j]);//输出符合条件的顶点visited[j]=1;//设置成已访问状态1EnQueue(&q,j);//入队}}}
}/*void BFSTraverse(AdMatrix *G)
{int i;//数组初始化为全0for(i=0;inumV;i++){visited[i]=0;}for(i=0;inumV;i++){if(visited[i]==0){BFS(G,i);}}
}
*/
int main()
{AdMatrix G;CreateGraph(&G);ShowGraph(&G);printf("输入BFS遍历的起始结点:");int n;scanf("%d",&n);BFS(&G,n-1);return 0;
}