码迷,mamicode.com
首页 > 其他好文 > 详细

图的两种遍历-DFS&BFS

时间:2016-02-02 00:01:58      阅读:342      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!