问题标题: 酷町堂:6153 无向图的广度优先搜索

0
0
已解决
袁瑞琳
袁瑞琳
中级守护
中级守护

6153   无向图的广度优先搜索

经验值:0 时间限制:1000毫秒

题目描述 Description

给出一个无向图,求出其广度优先搜索的结果。要求:同一层上的所有结点,按照编号从小到大输出。

输入描述 Input Description

第一行,两个整数,n m,表示图中有n个点,m条边
接下来m行,每行两个整数,x y,表示x和y之间存在一条边
再接下来一行,一个整数,st,表示起点编号

输出描述 Output Description

按顺序打印从st可以到达的所有点的编号,之间用空格隔开

样例输入 Sample Input

6 6 1 3 1 2 2 5 2 4 3 5 5 6 2

样例输出 Sample Output

2 1 4 5 3 6

数据范围及提示 Data Size & Hint

n <= 100

/*
广度优先遍历的思想是:首先以一个未被访问过的点作为起点,访问其相邻的所有点, 
然后在这些点中再访问与其相邻的所有点,直到所有点都被访问完为止 











*/
#include <iostream>
using namespace std;
int n,m,st,a,b,cur,book[1005],g[1005][1005];
int que[10005],head,tail=1,flag;
void bfs()
{
	head=1;
	que[tail++]=st;//将st号顶点加入队列 
	book[st]=1;
	while(1)
	{
		cur=que[head];//当前正在访问的节点编号
		for(int i=1;i<=n;i++)
		{
			if(g[cur][i]==1&&!book[i])//判断cur到i是否直达,并且i还要没有访问过 
			{
				que[tail++]=i;
				book[i]=1;
			}
			//如果tail==n+1,则所有的点都被访问 
			if(tail==n+1)//为什么是n+1,因为tail是指向队列的末尾的下一个元素的位置,元素1~n 
			{
				flag=1;
				break;
			}
		}
		if(flag==1)break;
		head++;
	}
	return ;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(i!=j)g[i][j]=0x3f3f3f3f;
		}
	}
	for(int i=1;i<=m;i++)
	{
		cin>>a>>b;
		g[a][b]=g[b][a]=1;
	}
	cin>>st;
	bfs();
	for(int i=1;i<tail;i++)
	{
		cout<<que[i]<<" ";
	}
	return 0;
}

Runtime Error 80分

求改正!

袁瑞琳在2021-08-25 16:41:02追加了内容

题号有错,是无向图的广度优先搜索


0
已采纳
杜承俊
杜承俊
资深守护
资深守护

核心:

q.push(t);

vis[t]=true;

while(!q.empty()){

int t=q.front();

cout<<t<<" ";

q.pop();

for(int i=1;i<=n;i++)

if(a[t][i]&&!vis[i]){

vis[i]=true;

q.push(i);

}

}

我要回答