深度优先与广度优先

【数据结构】图的遍历:广度优先(BFS),深度优先(DFS) 算法思想,广度优先生成树,深度优先生成树,算法实现 阅读详情
文章转载自:http://blog.youkuaiyun.com/a45872055555/article/details/37543795


今天做了道题目,《手机键盘输入》当按下23时,输出[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”]。

其实说白了,也就是全排列问题,将2代表的abc,和3代表的def输出组合的字符。

我是按照普通方法,递归来写的,觉得这道题目也只是考验编程,考验递归的。没太多考虑,当上网看别人都提到DFS(深度优先算法)后,才意识到,是有章法可循的。以前只以为深度优先和广度优先只是在图的遍历的时候才能用到,想不到这些也只是工具,看你怎么去应用到你的算法里面。


好了,不多说了,基于上述原因,参考《数据结构》和《算法导论》将广度优先和深度优先总结一下。


这两个算法的共同点,都是要有标记!数据结构采用的是一个数组来标记每一个结点是否被遍历;算法导论是在结点中附设一个颜色值,来表示遍历的程度。其实质是一样的,都需要借助于标记,来实现。但在二叉树的遍历中就不需要了,因为不会形成回路。


一:深度优先算法

方案一:“数据结构”

其实这是树的先根遍历的扩展。



通过图(b)我们可以看到,v1-v4-v8-v5-v3-v6-v7。

只要遍历到某一个结点,有子节点就先遍历子节点,当“子树”遍历完了以后,再遍历另一个“子树”,只是由于存在回路,所以遍历另一个子树的时候,会访问已经访问过的点, 所以就需要标记来判断。

代码如下:

  1. Boolean visited[MAX];           //设置标志数组  
  2. Status (*VisitFunc)(int v);     //全局变量函数,方便在DFS中调用DFSTraverse中传进的参数  
  3.   
  4. void DFSTraverse(Graph G,Status (*Visit)(int v))  
  5. {  
  6.     VisitFunc = Visit;  
  7.     for(v = 0;v < G.vexnum;++v)     //初始化,将标志数组全设为FALSE  
  8.         visited[v] = FALSE;  
  9.     for(v = 0;v < G.vexnum;++v)     //对所有的结点进行遍历,找到切入点,就调用DFS进行深度优先遍历  
  10.         if(!visited[v])  
  11.             DFS(G,v);  
  12. }  
  13.   
  14. void DFS(Graph G,int v)  
  15. {  
  16.     visited[v] = TRUE;  //给第v个结点标记,并访问该结点。  
  17.     VisitFunc(v);  
  18.     for(w = FirstAdjVex(G,v); w >= 0;w = NextAdjVex(G,v,w)) //对v的所有子节点w进行深度优先遍历  
  19.         if(!visited[w])  
  20.             DFS(G,w);  
  21. }  
Boolean visited[MAX];           //设置标志数组
Status (*VisitFunc)(int v);     //全局变量函数,方便在DFS中调用DFSTraverse中传进的参数

void DFSTraverse(Graph G,Status (*Visit)(int v))
{
    VisitFunc = Visit;
    for(v = 0;v < G.vexnum;++v)     //初始化,将标志数组全设为FALSE
        visited[v] = FALSE;
    for(v = 0;v < G.vexnum;++v)     //对所有的结点进行遍历,找到切入点,就调用DFS进行深度优先遍历
        if(!visited[v])
            DFS(G,v);
}

void DFS(Graph G,int v)
{
    visited[v] = TRUE;  //给第v个结点标记,并访问该结点。
    VisitFunc(v);
    for(w = FirstAdjVex(G,v); w >= 0;w = NextAdjVex(G,v,w)) //对v的所有子节点w进行深度优先遍历
        if(!visited[w])
            DFS(G,w);
}

说明:

1:这个题目写的很简化,在visited[v]中v是一个确定的数值,表示数组下标。但在VisitFunc(v)中,v为结点。虽然程序写法简化,但更能突出我们要解决的问题。

2:其实DFS和二叉树的先序遍历很相像:

  1. visit(p);  
  2. PreOrderTraverse(p->left);  
  3. PreOrderTraverse(p->right);  
visit(p);
PreOrderTraverse(p->left);
PreOrderTraverse(p->right);

其实就是将二叉树的确定性,转化成图子节点的不确定性,通过for循环来实现。

3:DFS可以应用在树的先序遍历当中。


方案二:“算法导论”

1:遍历过程

只要可能,就在图中尽量深入,总是对最近发现的结点v的出发边进行探索,直到该结点的所有出发边都被发现为止。然后回溯到v的父节点(可能有多个,但之前遍历过程中,从哪个点过来的,就是v的父节点),然后搜索该前驱结点的出发边。知道从源节点可以达到的所有的出发边都遍历完。如果在图中还有没被遍历的结点, 任选一个,重复上述过程。直到所有的结点遍历完为止。

2:当发现一个结点v时,记录其前驱结点u,并设置父节点指针v.π = u; 同样设置三种颜色,白色表示尚未被遍历的结点,灰色表示已经被遍历,但其子节点还没有被遍历完全,黑色表示该结点以及所有的子节点都被遍历完全,要返回到父节点。

3:给每个结点设置时间戳。v.d记录第一次被发现的时间,v.f记录对v扫描完成时的时间戳。其中time为全局变量


代码:

  1. DFS(G)  
  2. {  
  3.     for(u = 0;u < G.vexnum;++u){    //初始化所有的结点信息,父指针设为空,颜色全为白色  
  4.         u.color = WHITE;  
  5.         u.π = NULL;  
  6.     }  
  7.     time = 0;  
  8.     for(u = 0;u < G.vexnum;++u)     //开始遍历所有的结点,以防存在多个不相接的图  
  9.         if(u.color == WHITE)  
  10.             DFS_VISIT(G,u);  
  11. }  
  12.   
  13. DFS_VISIT(G,u){  
  14.     time = time + 1;    //每次赋值前都要增加1,time为全局变量  
  15.     u.d = time;  
  16.     u.color = GRAY;     //当访问了该结点,就将该节点设为灰色,接下来遍历其子节点。其实不要该灰色指示也行  
  17.     for(w = FirstAdjVex(G,v); w >= 0;w = NextAdjVex(G,v,w)) //处理子节点  
  18.         if(w.color == WHITE){  
  19.             w.π = u;  
  20.             DFS_VISIT(G,w);  
  21.         }  
  22.     u.color = BLACK;  
  23.     time = time + 1;  
  24.     u.f = time;  
  25. }  
DFS(G)
{
    for(u = 0;u < G.vexnum;++u){    //初始化所有的结点信息,父指针设为空,颜色全为白色
        u.color = WHITE;
        u.π = NULL;
    }
    time = 0;
    for(u = 0;u < G.vexnum;++u)     //开始遍历所有的结点,以防存在多个不相接的图
        if(u.color == WHITE)
            DFS_VISIT(G,u);
}

DFS_VISIT(G,u){
    time = time + 1;    //每次赋值前都要增加1,time为全局变量
    u.d = time;
    u.color = GRAY;     //当访问了该结点,就将该节点设为灰色,接下来遍历其子节点。其实不要该灰色指示也行
    for(w = FirstAdjVex(G,v); w >= 0;w = NextAdjVex(G,v,w)) //处理子节点
        if(w.color == WHITE){
            w.π = u;
            DFS_VISIT(G,w);
        }
    u.color = BLACK;
    time = time + 1;
    u.f = time;
}


生成的图



性质:

1、其生成的前驱制图G形成一个由多棵树所构成的森林,这是因为深度优先树的结构与DFS_VISIT的递归调用结构完全对应。

2、结点的发现时间和完成时间具有括号化结构。也就是只要两个结点的时间有重叠,毕竟一个结点的时间段包含在另一个结点的时间段内。



二:广度优先搜索

类似于树的按层次遍历的过程。

方案一:“数据结构”

先访问根结点,然后访问与跟相连的所有结点v1-vn,然后访问与v1-vn直接相连的所有结点(除去已经访问过的结点)。这就要用队列来时间:先访问某结点,然后将该结点如队列。从队列出结点,然后依次访问该结点的所有子节点(除去已经访问过的结点),并将这些刚刚访问结点入队列(这样将提前访问过的结点就不用入队列了,其子节点已经提前放入队列当中)。


访问过程是:v1-v2-v3-v4-v5-v6-v7-v8。


  1. void BFSTraverse(Graph G,Status(*Visit)(int v))  
  2. {  
  3.     for(u = 0;u < G.vexnum;++u) //初始化  
  4.         visited[u] = FALSE;  
  5.     InitQueue(Q);  
  6.     for(v = 0;v < G.vexnum;++v){    //遍历所有的结点  
  7.         if(!visited[v]){  
  8.             visited[v] = TRUE;  
  9.             Visit(v);   //先访问再入队列  
  10.             EnQueue(Q,v);  
  11.             while(!QueueEmpty(Q)){  
  12.                 DeQueue(Q,u);  
  13.                 for(w = FirstAdjVex(G,v); w >= 0;w = NextAdjVex(G,v,w)){  
  14.                     if(!visited[w]){  
  15.                         visited[w] = TRUE;  
  16.                         Visit(w);  
  17.                         EnQueue(Q,w);  
  18.                     }  
  19.                 }  
  20.             }  
  21.         }  
  22.     }  
  23. }  
void BFSTraverse(Graph G,Status(*Visit)(int v))
{
    for(u = 0;u < G.vexnum;++u) //初始化
        visited[u] = FALSE;
    InitQueue(Q);
    for(v = 0;v < G.vexnum;++v){    //遍历所有的结点
        if(!visited[v]){
            visited[v] = TRUE;
            Visit(v);   //先访问再入队列
            EnQueue(Q,v);
            while(!QueueEmpty(Q)){
                DeQueue(Q,u);
                for(w = FirstAdjVex(G,v); w >= 0;w = NextAdjVex(G,v,w)){
                    if(!visited[w]){
                        visited[w] = TRUE;
                        Visit(w);
                        EnQueue(Q,w);
                    }
                }
            }
        }
    }
}

方案二:“算法导论”

该算法可以得到最短路径。

  1. BFS(G,s)  
  2. {  
  3.     for(u = 0;u < G.vexnum;++u){  
  4.         u.color = WHITE;  
  5.         u.d = 10000;  
  6.         u.π = NULL;  
  7.     }  
  8.     s.color = GRAY;  
  9.     s.d = 0;  
  10.     s.π = NULL;  
  11.     Q = 空  
  12.     EnQueue(Q,s);  
  13.     while(!IsEmpty(Q)){  
  14.         u = DeQueue(Q);  
  15.         for(w = FirstAdjVex(G,v); w >= 0;w = NextAdjVex(G,v,w)){  
  16.             if(w.color == WHITE){  
  17.                 w.color = GRAY;  
  18.                 w.d = u.d + 1;  
  19.                 w.π = u;  
  20.                 EnQueue(Q,w);  
  21.             }  
  22.         }  
  23.         u.color = BLACK;  
  24.     }  
  25. }  
BFS(G,s)
{
    for(u = 0;u < G.vexnum;++u){
        u.color = WHITE;
        u.d = 10000;
        u.π = NULL;
    }
    s.color = GRAY;
    s.d = 0;
    s.π = NULL;
    Q = 空
    EnQueue(Q,s);
    while(!IsEmpty(Q)){
        u = DeQueue(Q);
        for(w = FirstAdjVex(G,v); w >= 0;w = NextAdjVex(G,v,w)){
            if(w.color == WHITE){
                w.color = GRAY;
                w.d = u.d + 1;
                w.π = u;
                EnQueue(Q,w);
            }
        }
        u.color = BLACK;
    }
}

遍历后的图形:



因为我们有设置父节点指针,当通过广度优先遍历之后,我们从要找的叶节点反向遍历到根结点,就能得到最短的路径。

  1. PRINT_PATH(G,s,v)  
  2. {  
  3.     if(v == s)  
  4.         print s;  
  5.     else if(v.π == NULL){  
  6.         print ”no path form”s“to”v  
  7.     }else{  
  8.         PRINT_PATH(G,s,v.π)  
  9.         print v;  
  10.     }  
  11. }  
PRINT_PATH(G,s,v)
{
    if(v == s)
        print s;
    else if(v.π == NULL){
        print "no path form"s"to"v
    }else{
        PRINT_PATH(G,s,v.π)
        print v;
    }
}





深度优先算法和广度优先算法 今天做了daoti 阅读详情

相关推荐

大话数据结构-图的深度优先遍历和广度优先遍历

数据结构中图的深度优先遍历、广度优先遍历定义,邻接矩阵、邻接表、逆邻接表、十字链表、邻接多重表和边集数组的深度优先遍历实现和广度优先遍历实现。

村长Korbin 1万+

【基础知识】一文看懂深度优先算法和广度优先算法

先上个图现在我们要访问图中的每个节点,即图的遍历。图的遍历是指,从给定图中任意指定的顶点(称为初始点)出发,按照某种搜索方法沿着图的边访问图中的所有顶点,使每个顶点仅被访问一次,这个过程称为图的遍历。我们根据访问节点的顺序与方式(根据搜索方法),可以分为广度优先(BFS)和深度优先(DFS),这是图论中两种非常重要的算法,生产上广泛用于拓扑排序,寻路(走迷宫),搜索引擎,爬虫等。我们分别来介绍。

fumeidonga的博客 1万+

无向图深度优先遍历(DFS)和广度优先遍历(BFS)算法

定义 深度优先遍历 (1)从图中某个初始顶点v出发,首先访问初始顶点v。 (2)选择一个与顶点v相邻且没被访问过的顶点w,再从w出发进行深度优先搜索,直到图中与当前顶点v邻接的所有顶点都被访问过为止。   (3) 利用递归实现,简单但是不好理解,时间复杂度 O(n+e)。 广度优先遍历 (1)访问初始点v,接着访问v的所有未被访问过的邻接点v1,v2,…,vt。 (2)按照v1,v2,…,vt的次序,访问每一个顶点的所有未被访问过的邻接点。    (3)依次类推,直到图中所有和初始点v有路径相通的顶点

horizon08的博客 1万+

算法总结-深度优先遍历和广度优先遍历

所以广度优先遍历也叫层序遍历,先遍历第一层(节点 1),再遍历第二层(节点 2,3,4),第三层(5,6,7,8),第四层(9,10)。(1)、我们从根节点1开始深度优先遍历,它相邻的节点有2、3、4,依先遍历节点2,再遍历2的右边节点5,再遍历9,至此便无可遍历的节点。对于每个节点来说,先遍历当前节点,然后把右节点压栈,再压左节点(这样弹栈的时候会先拿到左节点遍历,符合深度优先遍历要求)。广度优先遍历,指的是从图的一个未遍历的节点出发,先遍历这个节点的相邻节点,再依次遍历每个相邻节点的相邻节点。

hhhlizhao的博客 2万+

Ubuntu20.04安装NVIDIA显卡驱动避坑指南:从.run文件到完美运行

本文详细介绍了在Ubuntu20.04系统上通过.run文件安装NVIDIA显卡驱动的完整流程和避坑技巧。从禁用Nouveau驱动、选择合适显示管理器到处理常见安装问题,提供了一套经过验证的解决方案,帮助用户顺利完成驱动安装并优化性能。

weixin_30776273的博客 602

高效网络流量回放:使用tcpreplay实现多目标IP的pcap重放

本文详细介绍了如何使用tcpreplay工具高效回放网络流量pcap文件,并实现多目标IP发送。通过tcprewrite编辑报文和并行回放策略,可满足安全测试、负载测试等场景需求。文章涵盖安装、基础回放、核心技巧及性能优化,帮助读者构建真实流量压力测试环境。

weixin_29297127的博客 479

深度优先算法(DFS)和广度优先算法(BFS)

DFS和BFS介绍

愿你我都能实现自己的梦想 4706

【UE 反射】反射的原理是什么?如何使用机制?

静态类型检查确保了类型的早期一致性和高效的代码执行,但减少了灵活性。动态类型检查提供了更大的灵活性,但增加了运行时的开销和潜在的错误。反射作为一种动态特性,无论是在静态类型语言还是动态类型语言中,都提供了强大的运行时类型操作能力,但也伴随着性能和安全性方面的权衡。通过理解这些联系,开发者可以在不同的编程语言和应用场景中选择适合的类型检查方式和反射机制,以实现所需的动态行为和灵活性,同时保证性能和安全性。

hhw_hhw的博客 6032

深度优先算法和广度优先算法(python)

深度优先算法:深度优先搜索算法(Depth-First-Search),是搜索算法的一种。是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。属于盲目搜索 实现方法: ...

qq_41661056的博客 4333

车道线检测1.0(Python+Opencv基础版)

车道线检测是指在道路上自动检测和识别车道线的过程。车道线是道路上的标记,用于指示车辆行驶的方向和位置。 通过对车道线进行检测和识别,自动驾驶和智能驾驶系统可以实现车辆的自动导航、车道保持、车道偏离警告等功能。

Dream_orz的博客 4262

OpenCV实战系列——图像线条提取

基于内容的图像分析,需要从构成图像的像素集合中提取有意义的特征。轮廓、线条、区域等是基本的图像基元,可用于描述图像中包含的元素。本节将介绍如何提取重要的图像线条特征。

m0_58523831的博客 1万+

基于搜索的路径规划算法:什么是深度优先算法?什么是广度优先算法?

基于搜索的路径规划算法通常运用在基于栅格地图中,寻找路径的方式是通过一个一个节点的搜索。可以将其理解为洪水,由根节点向四周不断遍历,直到遍历到目标点。当然随着路径规划算法的不断发展,已实现“洪水”可以向着目标的大致方向流动,而不是简单粗暴的向着四周全方位流动,大大减轻了算力资源的浪费,提高了算法质量。下图便是目标(星型)向着目标(差型)搜索过程根据搜索方法的不同,又将搜索类算法分为了深度优先算法和广度优先算法。

huang1900237678的博客 1471

番外篇 | 关于YOLO11算法的改进点总结

关于YOLO11算法的改进点总结。🌈

小哥谈 2311

C++数据结构-图的遍历:DFS深度优先及广度优先详解

DFS(Depth-First-Search,深度优先搜索)算法的具体做法是:从某个点一直往深处走,走到不能往下走之后,就回退到上一步,直到找到解或把所有点走完。在实现这一个依次的访问顺序时,操作动作存储与数据结构(栈)的思想及其相似,同时也由于栈的性质,我们可以通过递归来简化栈的创建,因此DFS算法的两种做法分别时利用栈或者递归实现。算法步骤(递归或栈实现)a)访问指定起始地点。b)若当前访问顶点的邻接顶点有未被访问的顶点,就任选一个访问。

Dola的博客 4031

1.为什么要学习SIMULINK

用户也可以自定义和创建自己的模块,利用这些模块,用户可以创建层次化的系统模型,可以自上而下或自下而上地阅读模型,也就是说,用户可以查看最顶层的系统,然后通过双击模块进入下层的子系统查看模型,这不仅方便了工程人员的设计,而且可以使自己的模型方块图功能更清晰,结构更合理。此外,利用示波器模块或其他的显示模块,用户可以在仿真运行的同时观察仿真结果,而且还可以在仿真运行期间改变仿真参数,并同时观察改变后的仿真结果,最后的结果数据也可以输出到MATLAB工作区进行后续处理,或利用命令在图形窗口中绘制仿真曲线。

FPGA/MATLAB学习教程/源码/项目合作开发 1546

Autosar入门_OS_5

os hook函数说明

u012406840的博客 397

深度优先算法DFS和广度优先算法BFS

DFS概念: 深度优先搜索算法(Depth-First-Search),是搜索算法的一种。它沿着树的深度遍历树的节点,尽可能深的搜索树的分 支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发 现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。DFS属于盲目搜索。 DFS步骤: 深度优先遍历图算法步骤: 1. 访问顶点v; 2. 依次从v的未被访问的邻接点出发,对图

jianchibuxie0的博客 304

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

浅谈网络爬虫中广度优先算法和深度优先算法

网络爬虫中广度优先算法和深度优先算法,理论比较简单,实现也比较容易,适用于常规的新闻类网站。 对于数据以接口形式加载的网站,通用性不高;除非使用Selenium等模拟浏览器的方式将样式和数据渲染进网页后,在使用相关的算法进行操作。这种方法可行,但如果有效率限制的话,成本会非常高。...

sinat_32501475的博客 2043

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

深度优先搜索(DFS)和广度优先搜索(BFS)

DFS && BFS

weixin_43955293的博客 3万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

广度优先算法(BFS)&深度优先算法(DFS)

广度优先算法(BFS) 使用 BFS 的两个主要方案:遍历或找出最短路径。通常,这发生在树或图中。 模板 /** * Return the length of the shortest path between root and target node. * 返回根节点到目标节点的最短距离 */ int BFS(Node root, Node target) { Queue<Node> queue; // store all nodes which are waiting to

weixin_46083166的博客 257

【算法+城堡问题、迷宫问题】BFS(广度优先)和DFS(深度优先)

判断顶点1是否被访问,如未访问过,就见标记数组中顶点1对应的值改为true,将顶点1入队,再判断顶点2是否被访问,重复上述操作,将2入队。再通过矩阵找到顶点1的邻接顶点0、3,顶点0的访问标记数组为true,说明被访问则不再重复访问,继续判断3是否被访问过,未访问就将标记数组的值改为true,将3入队,队列不为空则将队头元素2出队。首先访问节点0,将数组0对应的位置改为true,表示已经访问过,再将顶点0进行入队操作,再判断队列是否为空(当前有顶点0不为空),将队列的对头元素0进行出队。

2302_82116250的博客 2266

Java图的表示与遍历(深度优先算法DFS+广度优先算法BFS)

1.图的表示 图的表示方式有两种:二维数组表示(邻接矩阵);链表表示(邻接表) 邻接矩阵是表示图形中顶点之间相邻关系的矩阵,对于n个顶点的图而言,矩阵是的row和col表示的是1…n个点。 邻接矩阵需要为每个顶点都分配n个边的空间,其实有很多边都是不存在,会造成空间的一定损失. 邻接表的实现只关心存在的边,不关心不存在的边。因此没有空间浪费,邻接表由数组+链表组成 为了表示方便,之后的图用二维...

m0_38036210的博客 1667

图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)

优质文档值得推荐 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)

天天向上 883

LeetCode广度优先与深度优先算法

经典题目 102.二叉树的层序遍历 给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。 示例: 二叉树:[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其层序遍历结果: [ [3], [9,20], [15,7] ] 如果不需要确定当前遍历到了哪一层,(BFS)广度优先遍历模板如下。 while queue 不空: cur ...

weixin_54379276的博客 314
上一篇: 经典八大排序算法
下一篇: ZeroMQ简明教程
createchance
博客等级 码龄15年 156粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值