图的深度优先遍历:邻接表实现

这里用邻接表实现图的深度优先遍历,采用递归实现。

#include<iostream>
using namespace std;
#define VERTEXNUM 5//结点数
struct  edgenode
{
    int to;
    int weight; // 边的权值
    edgenode *next;
};
struct vnode
{
    int from;
    edgenode *first;
};
void createGraph(vnode *adjilist, int start, int end,int weight);
void displayGraph(vnode *adjilist,int nodeNum);
void DFT(vnode *adjilist,int* vertexStatusArr,int nodeNum);
void DFTcore(vnode *adjilist,int i,int* vertexStatusArr);
/*更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/*/
int main(void){  

        //创建图
        vnode adjilist[VERTEXNUM];
        int nodeNum=VERTEXNUM;
        for(int i=0;i<nodeNum;i++)
            adjilist[i].first=NULL;
        int vertexStatusArr[VERTEXNUM]={0};
        cout<<vertexStatusArr[4]<<endl;
        createGraph(adjilist,0,3,0);
        createGraph(adjilist,0,4,0);
        createGraph(adjilist,3,1,0);
        createGraph(adjilist,3,2,0);
        createGraph(adjilist,4,1,0);  

        printf("after create:\n");
        displayGraph(adjilist,nodeNum);
        //深度优先遍历
        DFT(adjilist,vertexStatusArr,nodeNum);
        system("pause");
        return 0;
}
//创建图,采取前插法
void createGraph(vnode *adjilist, int start, int end,int weight)
{
    adjilist[start].from=start;
    edgenode *p=new edgenode;
    p->to=end;
    p->weight=weight;
    p->next=adjilist[start].first;
    adjilist[start].first=p;
}
//打印存储的图
void displayGraph(vnode *adjilist,int nodeNum)
{
    int i,j;
    edgenode *p;
    for(i=0;i<nodeNum;i++)
    {
        p=adjilist[i].first;
        while(p)
        {
            cout<<'('<<adjilist[i].from<<','<<p->to<<')'<<endl;
            p=p->next;
        }
     }
}
//深度优先遍历
void DFT(vnode *adjilist, int* vertexStatusArr,int nodeNum)
{
        printf("start BFT graph:\n");
        int i;
        for(i=0;i<nodeNum;i++){
                DFTcore(adjilist,i,vertexStatusArr);
        }
        printf("\n");
}
void DFTcore(vnode *adjilist,int i,int* vertexStatusArr)
{
    if(vertexStatusArr[i] == 1)
        return;
    printf("%d ",i);
    vertexStatusArr[i] = 1;
    edgenode *p;
    for(p=adjilist[i].first;p;p=p->next)
    {
        DFTcore(adjilist, p->to, vertexStatusArr);
    }
}

时间复杂度为O(V+E)。

作者:csdn博客 Duplan

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索递归
, int
, 深度
, 图的深度遍历
, dft
, void
, 遍历表
深度遍历
,以便于您获取更多的相关知识。

时间: 2024-09-20 00:16:03

图的深度优先遍历:邻接表实现的相关文章

算法研究:图的深度优先遍历

图的遍历和树的遍历类似,我们希望从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次,这一过程 就叫做图的遍历(Traverse Graph). 图的遍历方法一般有两种,第一种是深度优先遍历(Depth First Search),也 有称为深度优先搜索,简称为DFS.第二种是<广度优先遍历(Breadth  First Search)>,也有称为广度优先搜索, 简称为BFS.我们在<堆栈与深度优先搜索>中已经较为详细地讲述了深度优先搜索的策略,这里不再赘述.我们也可以把

图的深度优先遍历算法

前言 图的遍历与前面文章中的二叉树遍历还是存在很大区别的.所谓图的遍历指的是从图中的某一个顶点出发访问图中的其余顶点,并且需要保证每个顶点只被访问一次.由于图比二叉树复杂得多,所以前面二叉树的遍历算法在图中是行不通的.因为对于任意一个顶点来讲,都可能与其余的顶点发生连接.如果不对访问的顶点做一些处理,出发重复访问的几率是很高的.因此,一个基本思想是设置一个标记数组,主要用于标记已经被访问过的顶点.图的遍历算法主要有两种:深度优先遍历和广度优先遍历.本篇文章主要介绍的是深度优先遍历算法. 深度优先

图的深度优先遍历

/* 这是一个图的的深度优先搜索,我参考清华大学 c 语言版 1997年 4月第一版    教材中没有构图的函数CreatGraph(),FirstAdjVex()和NextAdjvex(),我在这里写出来了 .    图的存储结构采用邻接表存储.不过构图时的输入比较复杂,请读者认真读以下说明    说明:    假设有顶点 a(1) b(2) c(3) d(4) e(5)    图如下:                  (1)                  (a)            

算法-有关图的深度优先遍历问题的学习

问题描述 有关图的深度优先遍历问题的学习 请问,如何学习掌握深搜算法,求推荐例题,经典题目,为了参加ACM 解决方案 http://blog.csdn.net/u014271612/article/details/47705289 可以看一下思想! 解决方案二: 图的深度优先遍历图的深度优先遍历图深度优先遍历 解决方案三: www.codevs.cn 题库->搜索->深度优先搜索

C#中如何实现图的邻接矩阵和邻接表的显示

问题描述 C#中如何实现图的邻接矩阵和邻接表的显示,用silverlight实现的 解决方案 解决方案二:怎么没有人回答该问题那

图片-邻接表深度优先遍历该怎么写

问题描述 邻接表深度优先遍历该怎么写 麻烦各位看看怎么写 我写到 V4---V5就不知道怎么写下去了, 解决方案 邻接表深度优先遍历和广度遍历有向图邻接表的深度优先遍历邻接表-图的遍历-广度和深度优先遍历 解决方案二: 所谓深度优先:就是顺着一条路深入进去,直到无路可走才折返并重复深度优先过程; 所谓广度优先,就是把周围的路都走一遍再从邻点开始重复广度优先过程. 它们都是递归定义的~

C++实现图的邻接表存储和广度优先遍历实例分析_C 语言

本文实例讲述了C++实现图的邻接表存储和广度优先遍历方法.分享给大家供大家参考.具体如下: 示例:建立如图所示的无向图 由上图知,该图有5个顶点,分别为a,b,c,d,e,有6条边. 示例输入(按照这个格式输入): 5 6 abcde 0 1 0 2 0 3 2 3 2 4 1 4 输入结束(此行不必输入) 注:0 1表示该图的第0个顶点和第1个定点有边相连,如上图中的a->b所示       0 2表示该图的第0个顶点和第2个定点有边相连,如上图中的a->c所示       2 3表示该图的

图的存储形式:邻接表

邻接表:邻接表是图的一种链式存储结构.在邻接表中,对图中每个顶点建立一个单链表,第i个单链表中的节点表示依附于顶点vi的边(对有向图是以顶点vi为尾的弧).每个结点有三个域组成,其中邻接点域指示与顶点vi邻接的点在途中的位置,链域指示下一条边或者弧的结点:数据域存储和边或者弧相关的信息,如权值等.每个链表上附设一个表头结点.在表头结点中,除了设置链域指向链表第一个结点之外,还设置有存储顶点vi的名.如下所示: 实现: /**************************************

算法研究:图的广度优先遍历

图的遍历和树的遍历类似,我们希望从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次,这一过程 就叫做图的遍历(Traverse Graph). 图的遍历方法一般有两种,第一种是我们在前面讲过的<深度优先遍历 (Depth First Search)>,也有称为深度优先搜索,简称为DFS.第二种是广度优先遍历(Breadth  First Search), 也有称为广度优先搜索,简称为BFS.我们在<队列与广度优先搜索>中已经较为详细地讲述了广度优先搜索的策略,这里 不再