鱼C论坛

 找回密码
 立即注册
查看: 4304|回复: 5

关于图的广度遍历问题

[复制链接]
发表于 2016-3-13 20:40:19 | 显示全部楼层 |阅读模式
20鱼币
void BFSTraverse(MGraph G)
{
        int i, j;
        Queue Q;
       
        for( i=0; i < G.numVertexes; i++ )
        {
                visited[i] = FALSE;
        }
       
        initQueue( &Q );
       
        for( i=0; i < G.numVertexes; i++ )
        {
                if( !visited[i] )
                {
                        printf("%c ", G.vex[i]);
                        visited[i] = TRUE;
                        EnQueue(&Q, i);
                       
                        while( !QueueEmpty(Q) )
                        {
                                DeQueue(&Q, &i);
                                for( j=0; j < G.numVertexes; j++ )
                                {
                                        if( G.art[i][j]==1 && !visited[j] )
                                        {
                                                printf("%c ", G.vex[j]);
                                                visited[j] = TRUE;
                                                EnQueue(&Q, j);
                                        }
                                }
                        }
                }
        }
}个人觉得第二个for循环没必要存在,应为当while()循环结束时,所有顶点都遍历过了,没必要第二个for循环再次i++了

最佳答案

查看完整内容

如果没有第二个for(遍历所有节点),只使用while,那先把第一个父节点入队列,初步一想,是可以的~~ 但是这是图,如果有一个节点跟其余节点没有边呢?或者分好几个子图呢?例如: 1 4 | \ 3-2 上图,while之前把1节点EnQueue可以实现,但是4节点呢? 咋啦,不是亲娘生的就不管了? 撸主可能想把所有节点先压进去再说是吧?好,节点压入顺序就是遍历的顺序,这个不是我们手动写进去的。 如果我理解错了撸主的意 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-3-13 20:40:20 | 显示全部楼层
本帖最后由 n0noper 于 2016-3-14 10:13 编辑

如果没有第二个for(遍历所有节点),只使用while,那先把第一个父节点入队列,初步一想,是可以的~~
但是这是图,如果有一个节点跟其余节点没有边呢?或者分好几个子图呢?例如:

1        4
| \
3-2

上图,while之前把1节点EnQueue可以实现,但是4节点呢?  咋啦,不是亲娘生的就不管了?
撸主可能想把所有节点先压进去再说是吧?好,节点压入顺序就是遍历的顺序,这个不是我们手动写进去的。

如果我理解错了撸主的意思,举个例子,画个流程图大家讨论讨论。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-3-14 19:53:18 | 显示全部楼层
n0noper 发表于 2016-3-14 09:49
如果没有第二个for(遍历所有节点),只使用while,那先把第一个父节点入队列,初步一想,是可以的~~
但是这 ...

能加个微信好友么?想多点学友,自个一个人钻研,想一块学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-3-14 19:56:00 | 显示全部楼层
n0noper 发表于 2016-3-14 09:49
如果没有第二个for(遍历所有节点),只使用while,那先把第一个父节点入队列,初步一想,是可以的~~
但是这 ...

微信号yp2259376
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-3-15 08:25:15 | 显示全部楼层

加QQ吧,你那个微信号不存在··
QQ的话,传文件啥的比较方便。1263591465 如果不用QQ,邮箱联系也可以: n0noper@yeah.net
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-16 23:20:02 | 显示全部楼层
while之前把1节点EnQueue可以实现
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 17:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表