图的广度优先遍历

图的广度优先遍历

本实验实现邻接表表示下无向图的广度优先遍历。

程序的输入是图的顶点序列和边序列(顶点序列以*为结束标志,边序列以-1,-1为结束标志)。程序的输出为图的邻接表和广度优先遍历序列。例如:

程序输入为:
a
b
c
d
e
f
*
0,1
0,4
1,4
1,5
2,3
2,5
3,5
-1,-1

程序的输出为:
the ALGraph is
a 4 1
b 5 4 0
c 5 3
d 5 2
e 1 0
f 3 2 1
the Breadth-First-Seacrh list:aebfdc

下面展示一些 测试样例
测试输入

测试输入
a
b
c
d
e
f
*
0,1
0,4
1,4
1,5
2,3
2,5
3,5
-1,-1

测试输出

the ALGraph is
a 4 1
b 5 4 0
c 5 3
d 5 2
e 1 0
f 3 2 1
the Breadth-First-Seacrh list:aebfdc

代码如下

#include<stdio.h>
#include<stdlib.h>
struct node{
	char data;
	int num;
	int visit;
	int chain[50];
}list[50];
void bfs(int n)
{
	int queue[50];
	int qnum=0;
	if(list[n].visit==0)
	{
		printf("%c",list[n].data);
		list[n].visit=1;
	}
	for(int i=list[n].num-1;i>=0;i--)
	{
		if(list[list[n].chain[i]].visit==0)
		{
			queue[qnum++]=list[n].chain[i];
			printf("%c",list[list[n].chain[i]].data);
			list[list[n].chain[i]].visit=1;
		}
	}
	for(int i=0;i<qnum;i++)
	bfs(queue[i]);
}
int main()
{
	int n=0,a,b;
	char c;
	while(1)
	{
		c=getchar();
		if(c=='*')
		break;
		else
		{
			list[n].num=0;
			list[n].visit=0;
			list[n++].data=c;
		}
		getchar();
	}
	while(1)
	{
		scanf("%d,%d",&a,&b);
		if(a==-1&&b==-1)
		break;
		else
		{
			list[a].chain[list[a].num]=b;
			list[a].num++;
			list[b].chain[list[b].num]=a;
			list[b].num++;
		}
	}
	printf("the ALGraph is\n");
	for(int i=0;i<n;i++)
	{
		printf("%c",list[i].data);
		for(int j=list[i].num-1;j>=0;j--)
		printf(" %d",list[i].chain[j]);
		printf("\n");
	}
	printf("the Breadth-First-Seacrh list:");
	for(int i=0;i<n;i++)
	if(list[i].visit==0)
	bfs(i);
	printf("\n");
	return 0;
}

你可能感兴趣的:(图的广度优先遍历)