数据结构实验之图论二:基于邻接表的广度优先搜索遍历
Time Limit: 1000MS
Memory Limit: 65536KB
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顶点的无向边。
对于每组数据,第一行是三个整数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
#include<stdio.h> #include<string.h> int visited[1000],que[1000],a[1000],b[1000],head[200]; int l,j; struct node { int u,v; int next; }st[100000]; void add(int u,int v) { st[l].v = v; st[l].next = head[u]; head[u] = l++; } void bfs(int t) { int out = 0,in = 0; int i,x,h; visited[t] = 1; que[in++] = t; while(out < in) { h = que[out++]; a[j++] = h; x = 0; for(i = head[h]; i != -1; i = st[i].next) { if(!visited[st[i].v]) { b[x++] = st[i].v; visited[st[i].v] = 1; } } for(i = x-1; i >= 0; i--) que[in++] = b[i]; } } int main() { int i,n,m,k,t,l1,l2; scanf("%d",&t); while(t--) { l = 0; j = 0; memset(head,-1,sizeof(head)); memset(visited,0,sizeof(visited)); scanf("%d %d %d",&n,&m,&k); for(i = 0; i < m; i++) { scanf("%d %d",&l1,&l2); add(l1,l2); add(l2,l1); } bfs(k); for(i = 0; i < j; i++) if(i == j-1) printf("%d\n",a[i]); else printf("%d ",a[i]); } }