《数据结构》学习记录(13):图的遍历

一、概念

1、图的遍历

从图中任意指定的顶点(称为初始点)出发,按照某种搜索方法沿着图的边访问图中的所有顶点,使每个顶点仅被访问一次

二、深度优先遍历

  1. 从图中某个初始顶点v出发,首先访问初始顶点v
  2. 选择一个与顶点v相邻且没被访问过的顶点w,再从w出发进行深度优先搜索,直到图中与当前顶点v邻接的所有顶点都被访问过为止。

QMap<elementType,int> map;
void DFS(AdjGraph *G,elementType v)
{
    map[v] = 1; 		//置已访问标记
    qDebug()<<v;
    ArcNode *p{nullptr};
    for(int i = 0;i < MAXV;++i)
    {
        if(G->adjlist[i].data == v)
        {
            p = G->adjlist[i].firstarc;
            break;
        }
    }

    while (p)
    {
        elementType w = p->advex;
        if (!map.contains(w))
            DFS(G,w);   	//若w顶点未访问,递归访问它
        p = p->nextarc;     //p指向顶点v的下一条边的边头结点
    }
}
    int arr[MAXV][MAXV] = {{0,1,0,1,1},
                           {1,0,1,1,0},
                           {0,1,0,1,1},
                           {1,1,1,0,1},
                           {1,0,1,1,0}};
    AdjGraph * G{nullptr};
    elementType nodeName[MAXV] = {'A','B','C','D','E'};
    CreateAdj(G,arr,nodeName,8);
    DispAdj(G);

    qDebug()<<"----------";
    DFS(G,'C');

    DestroyAdj(G);

三、广度优先遍历

  1. 访问初始点v,接着访问v的所有未被访问过的邻接点v1,v2,…,vt。  
  2. 按照v1,v2,…,vt的次序,访问每一个顶点的所有未被访问过的邻接点。
  3. 依次类推,直到图中所有和初始点v有路径相通的顶点都被访问过为止。    

void BFS(AdjGraph *G,elementType v)
{
    QQueue<elementType> qu;
    QMap<elementType,int> map;

    qDebug()<<v;
    map[v] = 1;
    qu.enqueue(v);

    while (!qu.isEmpty())
    {
        elementType w = qu.dequeue();
        ArcNode *p{nullptr};
        for(int i = 0;i < MAXV;++i)
        {
            if(G->adjlist[i].data == w)
            {
                p = G->adjlist[i].firstarc;
                break;
            }
        }
        while (p)		//查找w的所有邻接点
        {
            if(!map.contains(p->advex)) 	//若当前邻接点未被访问
            {
                qDebug()<<p->advex;
                map[p->advex] = 1; //置已访问标记
                qu.enqueue(p->advex);//该顶点进队
            }
            p = p->nextarc;              	//找下一个邻接点
        }
    }
}
    int arr[MAXV][MAXV] = {{0,1,0,1,1},
                           {1,0,1,1,0},
                           {0,1,0,1,1},
                           {1,1,1,0,1},
                           {1,0,1,1,0}};
    AdjGraph * G{nullptr};
    elementType nodeName[MAXV] = {'A','B','C','D','E'};
    CreateAdj(G,arr,nodeName,8);
    DispAdj(G);

    qDebug()<<"----------";
    BFS(G,'C');
    DestroyAdj(G);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值