图的两种遍历:DFS&BFS

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);
            }
    }
}
posted @ 2016-02-01 22:07  &ATM  阅读(631)  评论(0编辑  收藏  举报
……