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

SDUT2142数据结构实验之图论二:基于邻接表的广度优先搜索遍历

2013-07-29 11:07 316 查看
http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2142&cid=1186

题目描述

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

输入

输入第一行为整数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顶点的无向边。

输出

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

示例输入

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


示例输出

0 3 4 2 5 1


主要难点是用邻接表去存,相比于邻接矩阵这个要稍麻烦一点,原则上有两种做法,先介绍用queue和vector的那种做法。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
priority_queue<int ,vector<int >,greater<int> >sort[151];
//sort数组是凡是与sort的下标相连的点组成的队列,且为优先队列
queue<int>q;//建立q普通队列
int u,v;
int mark;//控制输出
int vis[151];//标记数组
void BFS(int kk)
{
q.push(kk);// 是首元素,直接加入队列
vis[kk]=1;
while(!q.empty())//判断是否为空
{
int s=q.front();//取队列首元素
q.pop();//删除队列头元素,就是下面直接输出
if(mark)//控制输出空格
{
cout<<s;
mark=0;
}
else
printf(" %d",s);
while(!sort[s].empty())//判断这个相关联队列是否为空
{
int ss=sort[s].top();//取它的队列首元素
if(!vis[ss])//如果没被标记
{
q.push(ss);//就加入q队列中
vis[ss]=1;
}
sort[s].pop();//直接删除掉这个队列首元素
}
}
}

int main()
{
//memset(map,0,sizeof(map));

while(!q.empty())//将队列清空
q.pop();
int n;
cin>>n;
for(int i=1; i<=n; i++)
{
memset(vis,0,sizeof(vis));
int k,m,t;
cin>>k>>m>>t;
for(int k=1; k<=m; k++)//将队列清空
{
while(!sort[k].empty())
{
sort[k].pop();
}
}
for(int j=1; j<=m; j++)
{
cin>>u>>v;
sort[u].push(v);//因为是用邻接表在存储,所以用这种形式表示与u有关联的点存在sort这个队列中
sort[v].push(u);
}

mark=1;
BFS(t);
printf("\n");
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐