数据结构实验之图论二:基于邻接表的广度优先搜索遍历
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
Hint
用邻接表存储。
注意题目要求:同一个结点的同层邻接点,节点编号小的优先遍历。
所以需要对链表进行排序。用冒泡排序。
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int date;
struct node *next;
} ty;
ty *a[1001];
int n,begin,end;
int date[1001];
int via[1001];
void bfs(int t);
int main()
{
int list,m,t,i,x,y;
ty *p;
scanf("%d",&list);
while ( list-- ) {
scanf("%d %d %d",&n,&m,&t);
for ( i=0; i<1001; i++ ) {
a[i] = NULL;
}
for ( i=0; i<m; i++ ) {
scanf("%d %d",&x,&y);
// 无向图所以重复一遍
if ( a[x]==NULL ) {
a[x] = (ty *)malloc(sizeof(ty));
a[x] -> date = y;
a[x] -> next = NULL;
}
else {
p = (ty *)malloc(sizeof(ty));
p -> date = y;
p -> next = a[x]->next;
a[x] -> next = p;
}
if ( a[y]==NULL ) {
a[y] = (ty *)malloc(sizeof(ty));
a[y] -> date = x;
a[y] -> next = NULL;
}
else {
p = (ty *)malloc(sizeof(ty));
p -> date = x;
p -> next = a[y]->next;
a[y] -> next = p;
}
}
memset(date,0,sizeof(date));
memset(via,0,sizeof(via));
begin = end = -1;
date[++end] = t;
via[t] = 1;
printf("%d",t);
bfs(t);
printf("\n");
}
return 0;
}
void bfs(int t)
{
ty *j, *k;
int i;
for ( i=0; i<n; i++ ) { //是从小的结点开始遍历,所以要把每个结点之后的数进行从大到小排序
for ( j=a[i]; j; j=j->next ) {
for ( k=j->next; k; k=k->next ) {
if ( j->date > k->date ) {
int t = j->date;
j -> date = k -> date;
k -> date = t;
}
}
}
}
while ( begin<end ) {
int now = date[++begin];
for ( j=a[now]; j; j=j->next ) {
if ( via[j->date]==0 ) {
date[++end] = j->date;
via[j->date] = 1;
printf(" %d",j->date);
}
}
}
return ;
}
/***************************************************
User name: rj180323石旭
Result: Accepted
Take time: 0ms
Take Memory: 176KB
Submit time: 2019-02-17 20:07:31
****************************************************/