欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据结构实验之图论一:基于邻接矩阵的广度优先搜索遍历

程序员文章站 2022-05-21 12:11:01
...

Problem Description

给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列。(同一个结点的同层邻接点,节点编号小的优先遍历)

Input

输入第一行为整数n(0< n <100),表示数据的组数。
对于每组数据,第一行是三个整数k,m,t(0<k<100,0<m<(k-1)*k/2,0< t<k),表示有m条边,k个顶点,t为遍历的起始顶点。
下面的m行,每行是空格隔开的两个整数u,v,表示一条连接u,v顶点的无向边。

Output

输出有n行,对应n组输出,每行为用空格隔开的k个整数,对应一组数据,表示BFS的遍历结果。

Sample Input

1
6 7 0
0 3
0 4
1 4
1 5
2 3
2 4
3 5

Sample Output

0 3 4 2 5 1

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int a[110][110],b[110],flag[110];
int top,low;
int k,m,t;

void bfs(int t)//广度优先遍历
{
    int i;
    low++;//记录当前为广度优先遍历过的个数
    for(i=0; i<k; i++)//查找所有结点
    {
        if(a[t][i]==1&&flag[i]==0)//结点满足没有被遍历过和中间有通路这两个条件
        {
            b[top]=i;//将该结点的下标存入队列
            top++;//头指针向后移动
            flag[i]=1;//将该结点标记为已经遍历过的结点
        }
    }
    if(low<=top) //如果还没有遍历完所有的结点则进行递归
    {
        bfs(b[low]);
    }
        
}

int main()
{
    int n,i,u,v;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d %d %d",&k,&m,&t);
        for(i=0; i<m; i++)
        {
            scanf("%d %d",&u,&v);
            a[u][v]=1;
            a[v][u]=1;//用二维数组存储关系
        }
        low=0;//队列尾
        top=1;//队列头
        b[0]=t;//首位置进队列
        flag[t]=1;//标记该结点已经被遍历过
        bfs(t);//进行广度优先遍历
        for(i=0; i<top; i++)
        {
            if(i==top-1) 
            {
                 printf("%d\n",b[i]);
            }
            else 
            {
                 printf("%d ",b[i]);
            }
        }//将队列中的所有元素出栈
    }
    return 0;
}