图的深度优先遍历

本文详细介绍了图的深度优先遍历算法,包括其原理、应用及实现代码。通过实例解析,阐述了如何从一个顶点出发,访问所有与之相连且未被访问过的点,直至所有点都被访问的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图的遍历方式有两种,分别是图的深度优先遍历和图的广度优先遍历

其中,深度优先遍历的应用更为广泛。

深度优先遍历同深度优先搜索,“不撞南墙不回头”

从一个点A出发再访问所有与之相连且未被访问过的点,如果全部被

访问过,就退回上一个点继续访问,我们可以用一个visited数组来

记录点是否被访问过,整个过程可以用递归实现。

 

比如上面这个图,它的深度优先遍历的顺序(从v1出发)

v1-v2-v5-v3-v4-v6(顺序可能不同)

 

再比如这个c图(树是特殊的图-有向无环图),它的深度优先遍历顺序是

v1-v2-v4-(没有与四相连未被访问过的点,退回V2)-v5-(退回V2,退回v1)-v3-v6-(退回v3)-v7

更加直观。

 

Code:

#include<cstdio>
#include<iostream>

using namespace std;

struct node
{
    int end;
    int len;
    int next;
} ;node edge[2333];
int n,m,first[2333],visited[2333],cnt;

void add_edge(int s,int e,int d)
{
    cnt++;
    edge[cnt].end=e;
    edge[cnt].len=d;
    edge[cnt].next=first[s];
    first[s]=cnt;
    return;
}

void dfs(int s)
{
    visited[s]=true;
    printf("%d ",s);
    for(int i=first[s];i!=0;i=edge[i].next)
    {
        if(!visited[i]) dfs(i);
    }
    return;
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int s,e,d;
        scanf("%d%d%d",&s,&e,&d);
        add_edge(s,e,d);
        add_edge(e,s,d);
    }
    for(int i=1;i<=n;i++)
    {
        if(!visited[i]) dfs(i);
        printf("\n");
    }
    return 0;
}

/使用边表存图./

转载于:https://www.cnblogs.com/Hoyoak/p/10460178.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值