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

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

2017-08-10 19:13 232 查看


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

用邻接表存储。


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct mapp
{
int data;
mapp *next;
};

mapp *m[1000];
void creat(int x, int y)
{
if(m[x] == '\0')
{
m[x] = new mapp;
mapp *p;
p = new mapp;
m[x] ->next = p
4000
;
p ->data = y;
p ->next = NULL;
}
else
{
mapp *p = m[x];
mapp *q = p ->next;
while(y > q ->data)
{
q = q ->next;
p = p ->next;
if(q == NULL)
break;
}
mapp *o;
o = new mapp;
o ->data = y;
o ->next = q;
p ->next = o;
}
}
void bfs(int t, int k)
{
int line[1000];
line[0] = t;
int i = 0;
int j = 1;
int flag[1000] = {0};
flag[t] = 1;
while(i < j)
{
mapp *p = m[line[i]] ->next;
while(p)
{
if(flag[p ->data])
;
else
{
flag[p ->data] = 1;
line[j++] = p ->data;
}
p = p ->next;
}
i++;
}
for(i = 0; i < k - 1; i++)
printf("%d ", line[i]);
printf("%d\n", line[i]);
}

void F(int k)
{
int i;
mapp *p;
mapp *q;
for(i = 0; i < k; i++)
{
if(m[i] != NULL)
{
p = m[i];
q = p ->next;
while(q)
{
free(p);
p = q;
q = q ->next;
}
free(p);
}
else
continue;
}
}
int main()
{
int n;
int k, M, t;
scanf("%d", &n);
while(n--)
{
scanf("%d %d %d", &k, &M, &t);
while(M--)
{
int x, y;
scanf("%d %d", &x, &y);
creat(x, y);
creat(y, x);
}
bfs(t, k);
F(k);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐