首页 > 其他 > 详细

图的两种遍历-DFS&BFS

时间:2016-02-01 23:58:41      阅读:484      评论:0      收藏:0      [点我收藏+]

DFS和BFS在图中的应用:

图连通性判定;路径的存在性;图中是否存在环;求图的最小生成树;求图的关键路径;求图的拓扑排序。


DFS:简单的说,先一直往深处走,直到不能再深了,再从另一条路开始往深处走,直到所有路都走完;

struct node
{
    int next;  //E[i].next指向图中与i同父的下一个结点
    int to;  //E[i].to指向图中i的子结点
}E[110];

int N;
int fa[110];  //记录各点的父结点
bool vis[110];  //记录这个点是否走过

void DFS(int u)
{
    vis[u]=1;
    for(int i=fa[u];i!=-1;i=E[i].next)
        if(vis[E[i].to]==0)
            DFS(E[i].to);  //DFS靠递归实现
}

BFS:把图看成树,先在同一层遍历各结点,再一层一层地依次往下遍历;

//用队列queue实现
bool vis[110];

void BFS(int root,int N)  //有N个点的图,从root点开始遍历(搜索)
{
    queue<int> que;
    memset(vis,0,sizeof(vis));
    vis[root]=1;
    que.push(root);

    int u;

    while(!que.empty())  //当图不是空的时候
    {
        u=que.front();  //将队首值赋给变量u
        que.pop();  //删除队首元素

        for(int i=fa[u];i!=-1;i=E[i].next)  //找到和u相连的所有点
            if(vis[E[i].to]==0)
            {
                vis[E[i].to]=1;
                que.push(E[i].to);
            }
    }
}

图的两种遍历-DFS&BFS

原文:http://www.cnblogs.com/atmacmer/p/5176420.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!