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

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

2017-08-15 17:18 543 查看
题目链接

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的遍历结果。

Example Input

1

6 7 0

0 3

0 4

1 4

1 5

2 3

2 4

3 5

Example Output

0 3 4 2 5 1

Hint

用邻接表存储。

注意点:

1.定义的变量不能重复,定义AdjL t[100]之后不能再次定义变量t,

否则容易出现如下错误:error: invalid types ‘int[int]’ for array subscript

2.使用邻接表的时候必须对头结点的链表进行初始化

3.邻接表建立无向图,u接在v后面,v接在u后面,即定义一个节点

p = new Node;

p->num = u;

p->next = head[v]->next;

head[v]->next = p;

p = new Node;

p->num = v;

p->next = head[u]->next;

head[u]->next = p;

4.

#include <iostream>
#include<cstring>
#include<queue>
using namespace std;
typedef struct ADJL{
int data;
struct ADJL *next;
}*AdjL,ADJL;
AdjL head[110],p;
void bfs(int s);//起始位置
int visited[110];
int n, m, s;
int main(){
int k;
cin>>k;
while(k--){
memset(visited,0,sizeof(visited));
cin>>n>>m>>s;
for(int i = 0;i<n;i++){
head[i] = new ADJL;
head[i]->next = NULL;
}
for(int i = 0;i<m;i++){
int u, v;
cin>>u>>v;
p = new ADJL;
p->data = v;
p->next = head[u]->next;
head[u]->next = p;
p = new ADJL;
p->data = u;
p->next = head[v]->next;
head[v]->next = p;
}
bfs(s);
cout<<endl;
}
return 0;
}
void bfs(int s){
for(int i = 0;i<n;i++){
for(p = head[i]->next;p;p = p->next){
for(AdjL q = p->next;q;q = q->next){
if(p->data>q->data){
int tmp = p->data;
p->data = q->data;
q->data = tmp;
}
}
}
}
queue<int>Q;
int q;
Q.push(s);//入队
visited[s] = 1;
while(!Q.empty()){
cout<<(q = Q.front())<<" ";
Q.pop();//出队
for(p = head[q]->next;p;p = p->next)
if(!visited[p->data]){
visited[p->data] = 1;
Q.push(p->data);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐