您的位置:首页 > 理论基础 > 数据结构算法

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

2017-11-23 09:00 579 查看
#include <iostream>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
int map[1000][1000],tag[1000],a[1000];//map存储矩阵,tag存储标识符(遍历过为1,初始为0),a存储遍历后得到的数组
int p;
void BFS(int t,int n)//t为遍历起点,n为点的总个数
{
queue <int> Q;
p = 0;
tag[t] = 1;
a[p++] = t;
Q.push(t);
while(!Q.empty())
{
int v = Q.front();
Q.pop();
int i;
for(i = 0;i <= n - 1;i++)
{
if(tag[i] == 0 && map[v][i] == 1)
{
tag[i] = 1;
a[p++] = i;
Q.push(i);
}
}
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
int k,m,n;
cin>>k>>m>>n;
memset(map,0,sizeof(map));//把map数组初始化为0,用cstring头文件,在建立矩阵之前初始化,是的矩阵中全部为0,加进去的数组的点才为1
memset(tag,0,sizeof(tag));
while(m--)
{
int u,v;
cin>>u>>v;
map[u][v] = 1;
map[v][u] = 1;//矩阵存储一个边相邻的两个点,存在取为1,其他取为0;
}
BFS(n,k);
cout<<a[0];
int i;
for(i = 1;i <= p - 1;i++)
{
cout<<" "<<a[i];
}
cout<<endl;
}
return 0;
}


结题思路:
先建立一个二维数组,用来存储矩阵,并将其初始化为0,;然后,在输入边(u,v)之后,将其对应的点的二维数组中的值(map[u][v])变为1,然后进行BFS;

BFS:先将起始点的的标志值设为1,将其存入遍历后的数组中,将其入队列,然后进入判断队列空的while循环中,只要队列不空,重复一下操作:1.取队头元素,将其出队列,然后判断所有的点tag值是不是0(没遍历过)并且map[v][i]为1(在矩阵中存在),就将其tag值变为1,存入遍历后的数组a中,并将其入队列;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐