Kruskal算法解析及Java代码实现(附图)

算法-Kruskal算法 package com.chb.Kruskal; import java.util.Arrays; public class KruskalCase { private int edgeNum; //边的个数 private char[] vertexs; //顶点数组 private int[][] matrix; //邻接矩阵 //使用 INF 表示两个顶点不能连通 p... 阅读详情

最小生成树

       在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树。

example:

例如,对于如上图G4所示的连通网可以有多棵权值总和不相同的生成树。

 

克鲁斯卡尔(Kruskal)算法

克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法,基于连续的按照最小边的策略进行生成树的构建。Kruskal算法开始的时候把每个顶点都当做棵树,这样就是个森林,然后选取最小的边进行树的连接,最后生成只含有一棵树。

基本思想:将图的存储结构使用边集数组的形式表示,并将边集数组按权值从小到大排序,遍历边集数组,每次选取一条边并判断是否构成环路,不会构成环路则将其加入最小生成树,最终只会包含n-1条边(n为无向图的顶点数)。


具体做法:

  1. 每次选取最小的边来构成生成树
  2. 将这条边加入后不能形成闭环

 

伪代码:

图解:

第1步:将边<E,F>加入R中。 
边<E,F>的权值最小,因此将它加入到最小生成树结果R中。 
第2步:将边<C,D>加入R中。 
上一步操作之后,边<C,D>的权值最小,因此将它加入到最小生成树结果R中。 
第3步:将边<D,E>加入R中。 
上一步操作之后,边<D,E>的权值最小,因此将它加入到最小生成树结果R中。 
第4步:将边<B,F>加入R中。 
上一步操作之后,边<C,E>的权值最小,但<C,E>会和已有的边构成回路;因此,跳过边<C,E>。同理,跳过边<C,F>。将边<B,F>加入到最小生成树结果R中。 
第5步:将边<E,G>加入R中。 
上一步操作之后,边<E,G>的权值最小,因此将它加入到最小生成树结果R中。 
第6步:将边<A,B>加入R中。 
上一步操作之后,边<F,G>的权值最小,但<F,G>会和已有的边构成回路;因此,跳过边<F,G>。同理,跳过边<B,C>。将边<A,B>加入到最小生成树结果R中。

此时,最小生成树构造完成!它包括的边依次是:<E,F> <C,D> <D,E> <B,F> <E,G> <A,B>。

 

package kruskal;

import java.util.ArrayList;
import java.util.List;

public class Kruskal {
	 
    /** 邻接矩阵, 为二维数组, 也称地图 */
    private int[][] matrix;
    /** 设置最大权重范围, 表示正无穷 */
    private int MAX_WEIGHT = Integer.MAX_VALUE;
    /** 边集数组, 采用List接口的实现类ArrayList(数组线性表), 遍历元素和随机访问元素的效率比较高 */
    private List<Edge> edgeList = new ArrayList<Edge>();
 
    /**
     * 创建地图
     */
    private void createGraph(int index) {  //index表示顶点个数
        matrix = new int[index][index];    //邻接矩阵是一个长宽相等的正方形矩阵
        //邻接矩阵中每一行的数组, 按照原图以此填充
        int[] v0 = { 0, 10, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 11, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT };
        int[] v1 = { 10, 0, 18, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 16, MAX_WEIGHT, 12 };
        int[] v2 = { MAX_WEIGHT, 18, 0, 22, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 8 };
        int[] v3 = { MAX_WEIGHT, MAX_WEIGHT, 22, 0, 20, MAX_WEIGHT, MAX_WEIGHT, 16, 21 };
        int[] v4 = { MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 20, 0, 26, MAX_WEIGHT, 7, MAX_WEIGHT };
        int[] v5 = { 11, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 26, 0, 17, MAX_WEIGHT, MAX_WEIGHT };
        int[] v6 = { MAX_WEIGHT, 16, MAX_WEIGHT, 24, MAX_WEIGHT, 17, 0, 19, MAX_WEIGHT };
        int[] v7 = { MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 16, 7, MAX_WEIGHT, 19, 0, MAX_WEIGHT };
        int[] v8 = { MAX_WEIGHT, 12, 8, 21, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 0 };
        matrix[0] = v0;
        matrix[1] = v1;
        matrix[2] = v2;
        matrix[3] = v3;
        matrix[4] = v4;
        matrix[5] = v5;
        matrix[6] = v6;
        matrix[7] = v7;
        matrix[8] = v8;
    }
    
    /**
     * 创建边集数组,并且对他们按权值从小到大排序(顺序存储结构也可以认为是数组吧)
     */
    public void createEdges() {
    	//调用带参构造,此处三个参数分别为begin,end,weight
        Edge v0 = new Edge(4, 7, 7);
        Edge v1 = new Edge(2, 8, 8);
        Edge v2 = new Edge(0, 1, 10);
        Edge v3 = new Edge(0, 5, 11);
        Edge v4 = new Edge(1, 8, 12);
        Edge v5 = new Edge(3, 7, 16);
        Edge v6 = new Edge(1, 6, 16);
        Edge v7 = new Edge(5, 6, 17);
        Edge v8 = new Edge(1, 2, 18);
        Edge v9 = new Edge(6, 7, 19);
        Edge v10 = new Edge(3, 4, 20);
        Edge v11 = new Edge(3, 8, 21);
        Edge v12 = new Edge(2, 3, 22);
        Edge v13 = new Edge(3, 6, 24);
        Edge v14 = new Edge(4, 5, 26);
        
        //同时加入边集数组中(数组线性表)
        edgeList.add(v0);
        edgeList.add(v1);
        edgeList.add(v2);
        edgeList.add(v3);
        edgeList.add(v4);
        edgeList.add(v5);
        edgeList.add(v6);
        edgeList.add(v7);
        edgeList.add(v8);
        edgeList.add(v9);
        edgeList.add(v10);
        edgeList.add(v11);
        edgeList.add(v12);
        edgeList.add(v13);
        edgeList.add(v14);
    }
 
    /**
     * 克鲁斯卡尔算法
     */
    public void kruskal() {
        //创建图和边集数组, 该图有v0-v8共9个顶点s
        createGraph(9);
        //可以由图转出边集数组并按权从小到大排序,这里为了方便观察直接写出来了
        createEdges();
        
        //定义一个数组用来判断边与边是否形成环路(并查集知识)
        int[] parent = new int[9];
        
        /** 权值总和, 是判断最小生成树的重要依据 , 初始化为0 */
        int sum = 0;
        
        int n, m;
        
        //遍历得到每一条边
        for (int i = 0; i < edgeList.size(); i++) {
            Edge edge= edgeList.get(i);
            n = find(parent, edge.getBegin());  
            m = find(parent, edge.getEnd());    
            
            //如果 m == n 说明形成了环路或者两个结点都在一棵树上
            //反之,如果 n和m 不等则说明没有闭合线路
            if (n != m) {
                parent[n] = m;   // 设置n在"已有的最小生成树"中的终点为m(就是把n合并在m所在的连通分量中)
                System.out.println("(" + edge.getBegin() + "," + edge.getEnd() + ")" +edge.getWeight());
                
                sum += edge.getWeight();  //加上对应边的权重,更新sum值
            }
        }
        
        System.out.println("权值总和为:" + sum);
    }
 
    public int find(int[] parent, int index) {
        while (parent[index] > 0) {
        	//parent[0] = 1表示顶点0,1已经加入生成树中
            index = parent[index];
        }
        return index;
    }
 
    public static void main(String[] args) {
        Kruskal graph = new Kruskal();
        graph.kruskal();
    }
 
}
package kruskal;

/**
 * 克鲁斯卡尔->最小生成树边实体
 * @author Administrator
 *
 */
class Edge {
 
    private int begin;   //边的起点
    private int end;     //边的终点
    private int weight;  //边的权重
 
    public Edge(int begin, int end, int weight) {  //带参构造
        super();
        this.begin = begin;
        this.end = end;
        this.weight = weight;
    }
 
    public int getBegin() {
        return begin;
    }
 
    public void setBegin(int begin) {
        this.begin = begin;
    }
 
    public int getEnd() {
        return end;
    }
 
    public void setEnd(int end) {
        this.end = end;
    }
 
    public int getWeight() {
        return weight;
    }
 
    public void setWeight(int weight) {
        this.weight = weight;
    }
 
    @Override
    public String toString() {
        return "Edge [begin=" + begin + ", end=" + end + ", weight=" + weight + "]";
    }
 
}

代码中所用的图数据如下:

运行结果:

Kruskal算法的实现(Java) 它的主要思想是通过不断选择边,将图中的所有顶点连接起来,直到形成一个树,并且保证这个树的权重最小。通过定义边类和图类,并结合并查集来判断边的连通性,我们可以使用Kruskal算法有效地求解最小生成树问题。在Kruskal算法中,边是图的构建块,我们将使用一个简单的类来表示边。该方法使用Kruskal算法的核心逻辑,通过遍历边列表并按权重排序,逐步构建最小生成树。在这个示例中,我们创建了一个具有6个顶点和9条边的图。方法来查找顶点的根节点,并且通过路径压缩的方式优化查找过程。在图类中,我们实现了一个。 阅读详情

相关推荐

华为OD机试A卷 - 单向链表中间节点(Java & Python& JS & C++ & C )

今天,我将解析一段Java代码,该代码实现了Kruskal算法,用于在连通的无向图中找到最小生成树。

算法大师! 209

算法-克鲁斯卡尔算法

应用场景-公交站问题 1) 某城市新增 7 个站点(A, B, C, D, E, F, G) ,现在需要修路把 7 个站点连通 2) 各个站点的距离用边线表示(权) ,比如 A – B 距离 12 公里 3) 问:如何修路保证各个站点都能连通,并且总的修建公路总里程最短? 克鲁斯卡尔算法介绍 1) 克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法。 2) 基本思想:按照权值从小到大的顺序选择 n-1 条边,并保证这 n-1 条边不构成回路 3) 具体做法:..

donkeyboy001的博客 1238

Kruskal算法的Java实现

Kruskal算法是一种用于解决最小生成树问题的贪心算法,其主要思想是通过选择边来逐步构建最小生成树。在这篇文章中,我们将详细介绍如何使用Java来实现Kruskal算法,并提供相应的源代码。通过读取图中的边,并按照权重进行排序,在保证不形成环路的情况下逐步构建最小生成树。这个算法的时间复杂度为O(ElogE),其中E是边的数量。现在,我们已经完成了Kruskal算法的实现。接下来,让我们使用一个例子来测试我们的代码。接下来,我们需要实现Kruskal算法的主要逻辑。Kruskal算法的Java实现。

CodeRoarX的博客 255

最小生成树,克鲁斯卡尔(Kruskal)算法,邻接表

基本思想:将所有顶点之间路径权值,从小到大有序排列,并在程序中优先遍历路径小的顶点,记录不存在环的路径,直至全部循环完毕。 There are N villages, which are numbered from 1 to N, and you should build some roads such that every two villages can connect to each oth...

weixin_44350170的博客 1624

从零打造音乐会级特雷门琴:原理、设计与调试全解析

电子乐器的工作原理通常基于信号生成与调制。特雷门琴作为世界上最早的电子乐器之一,其核心原理是利用射频振荡器和电容传感,将演奏者的手势变化转化为音高与音量信号。这种技术通过外差式混频实现音高控制,并利用压控放大器实现细腻的音量动态,其工程价值在于将抽象的空间位置信息精确映射为连续的音频参数。在音乐制作、声音艺术和交互装置等领域,这类技术为创造独特的演奏体验提供了基础。本文聚焦于如何从电路层面实现一台高稳定性的特雷门琴,详细阐述了从LC振荡器设计、天线场形优化到音色混合检波等关键环节,并分享了基于LTspice

weixin_34046298的博客 171

深入解析安卓性能分析工具systrace/atrace的使用技巧与实战场景

本文深入解析了安卓性能分析工具systrace/atrace的核心使用技巧与实战场景。文章澄清了环境搭建的常见误区,详细拆解了命令参数,并通过列表卡顿、启动优化等具体案例,手把手指导开发者利用这些工具精准定位性能瓶颈,提升应用流畅度。

yyy34的博客 240

Kruskal算法(java)

一、Kruskal算法介绍   Kruskal算法是一种构造最小生成树的算法。时间复杂度为O(∣E∣log∣E∣)O(|E|log|E|)O(∣E∣log∣E∣)。Kruskal算法适合于边稀疏而顶点较多的图。 二、Kruskal算法原理   (1)初始时为只有n个顶点而无边的非连通图T,每个顶点自成一个连通分量。   (2)按照边的权值由小到大的顺序,不断选取当前未被选取过且权值最小的边,若该边依附的顶点落在T中不同的连通分量上,则将此边加入T,否则舍弃此边而选择下一条权值最小的边。换句话说,加入的边不能

weixin_43698993的博客 2692

扫码器USB键盘报告描述符数据格式解析

Byte0用于判断Shift是否按下,当按下时Byte0的Bit1会置1,即0x02,若未按下,Bit为0,即0x00。0x00 0x00 0x00 0x00 0x00 0x00 0x00--->>未按下Shift。0x00 0x00 0x00 0x00 0x00 0x00 0x00--->>按下Shift。0x00 0x04 0x00 0x00 0x00 0x00 0x00--->>输出A。0x00 0x04 0x00 0x00 0x00 0x00 0x00--->>输出a。

m0_65548585的博客 1142

Java算法学习9——最小生成树之Kruskal算法

一、Krusal算法简介 Krusal算法其实就是以边为主,每次都选择权重最小的并且两个端点不在同一个连通分量的那条边加进生成树T中,知道T的边达到了顶点数-1之后,就暂停。所以,可以先将边按从小到大进行排序,然后再去选取每一条边,判断它的两个端点是否是同一连通分量 二、Krusal算法实现步骤 输入格式:第一行有两个整型数,第一个数为顶点数,第二个数为边数N,接下来就要N行,每一行有3个字符,第一个为字母就是起点,第二个字母是终点,第三个数字是权重。 输出格式:输出一个整数,表示最小生成树的权重和 实现步

Warddamn的博客 3083

保姆级教程:用GROMACS 2022.4的拉伸模拟(SMD)加速蛋白-蛋白组装过程

本文详细介绍了如何使用GROMACS 2022.4的拉伸分子动力学模拟(SMD)技术加速大蛋白组装过程。通过CHARMM36力场和SMD技术,将传统需要数月的蛋白结合过程缩短至数天,大幅提升模拟效率。文章包含参数设计、索引组创建、周期性边界处理等实战技巧,并提供了完整的GPU加速工作流和常见问题解决方案。

weixin_30338481的博客 445

Cube.js 安装避坑指南:从零到一键启动

本文是一份详细的Cube.js安装避坑指南,旨在帮助开发者从零开始顺利启动Cube.js。文章重点强调了安装前的环境准备,包括Node.js版本、包管理工具和项目路径等关键“地基”,并深入解析了使用npx安装的优势、数据库类型选择以及数据库连接配置的核心步骤与常见陷阱,确保您能高效完成安装并成功启动服务。

weixin_29218509的博客 429

Acwing 858-Prim算法求最小生成树

给定一个n个点m条边的无向图,图中可能存在重边和自环,边权可能为负数。 求最小生成树的树边权重之和,如果最小生成树不存在则输出impossible。 给定一张边带权的无向图G=(V,E),其中VV表示图中点的集合,EE表示图中边的集合,n=|V|,m=|E|。 由V中的全部n个顶点和E中n−1条边构成的无向连通子图被称为G的一棵生成树,其中边的权值之和最小的生成树被称为无向图G的最小生成树。 输入格式 第一行包含两个整数n和m。 接下来m行,每...

她与伞皆过客的博客 1971

别再手动巡检了!用Zabbix 5.0 + SNMPv2自动监控华为S系列交换机(附完整命令集)

本文详细介绍了如何利用Zabbix 5.0与SNMPv2实现华为S系列交换机的自动化监控,告别低效的手动巡检。通过配置SNMPv2c安全基线、核心功能启用及Zabbix Server端深度配置,构建7×24小时监控体系,实时预警接口状态、流量波动等关键指标,大幅提升运维效率与故障响应速度。

weixin_30940783的博客 628

java数据结构和算法——克鲁斯卡尔(Kruskal)算法

目录一、克鲁斯卡尔(Kruskal)算法介绍二、连通网的最小生成树理解三、克鲁斯卡尔(Kruskal)算法——应用场景(公交站问题)四、克鲁斯卡尔(Kruskal)算法图解五、克鲁斯卡尔(Kruskal)算法分析六、如何判断是否构成回路——示例说明七、克鲁斯卡尔(Kruskal)算法——代码实现 一、克鲁斯卡尔(Kruskal)算法介绍 克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法。 基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路。 具体做法:首先构

小志的博客 1263

1、工作流介绍

工作流起源于办公自动化,是对软件中业务流程的抽象。通过工作流将各个任务有序组织起来形成一个完整的业务闭环。比如:请假审批流程,网上购物流程,银行贷款流程;!

leyoliu的博客 5109

基于 Verilog 的经典数字电路设计(10)三态门

三态门(Triple-State Gate)亦称 “三态输出门”、“三态门输出电路”,是一种重要的总线接口电路,具有高电平、低电平和高阻抗三种输出状态的门电路,不过我们通常在设计中比较少见。   三态指其输出既可以是一般二值逻辑电路,即正常的高电平(逻辑 1)或低电平(逻辑 0),又可以保持特有的高阻抗状态,高阻态相当于隔断状态(电阻很大,相当于开路)。

新芯设计的博客 1万+

JAVA数据结构------------超详细讲解Kruskal(克鲁斯卡尔算法)图的遍历和最小生成树

最近复习到了数据结构中图的遍历和最小生成树部分,我在这里记录用java写的Kruskal算法,方便自己回顾,并且与他人交流学习。 关于Kruskal算法的理论部分我就不再陈述了 直接上代码: /** * * 使用克鲁斯卡尔算法来实现图的最小生成树 * * 克鲁斯卡尔锁使用的时边集与普里姆算法的顶点集不同,因此不能使用临接矩阵来表示图 * * 算法思想:1.先将边按照 权值大小 ...

qq_43507104的博客 368

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java十大算法之克鲁斯卡尔算法

应用场景: 1.克鲁斯卡尔算法介绍 克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法,基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路,具体做法:首先构造一个只含有n个顶点的森林,然后依权值从小到大从连通网中选择边加入到森林中,并使森林中不产生回路,直到森林变成一棵树为止 接下来用图解的方式进行一下分析: 上面的连通网,不同的连通方式,权值总和...

qq_44962429的博客 818

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Java的KruskaI知识点(含面试大厂题和源码)

Kruskal算法从考虑所有边的集合开始,按照边的权重从小到大排序。然后,依次添加权重最小的边,同时确保添加的边不会与已添加的边形成环。这个过程一直持续到所有顶点都被连接起来,或者所有的边都被考虑过。

2302_80314137的博客 1298

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C++:用邻接表表示克鲁斯卡尔算法

typedef struct ArcNode { char adjvex; ArcNode* nextArc; int weight; }ArcNode,*pArcNode; typedef struct VNode { char date; pArcNode firstArc; }VNode,*pVNode; typedef struct { pVNode vert; int vexnum, arcnum; }ALGraph; typedef struct Ed{ char Hea.

m0_62518283的博客 1218

贪心算法之最小生成树详细解读(附带Java代码解读)

最小生成树(Minimum Spanning Tree, MST)是图论中的一个重要概念,通常应用于无向加权图。在这种图中,顶点通过带有权重的边相连接,权重通常表示某种“成本”(如距离、费用等)。最小生成树是连接图中所有顶点的一个生成树,并且使得树中所有边的权重之和最小。

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 969

Java:实现Kruskal算法(附带源码)

Java:实现Kruskal算法(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1977

【Java数据结构】04-图(Prim,Kruskal,Dijkstra,topo)

讲解最小支撑树(Prim算法、Kruskal算法)、最短路径(Dijkstra算法)、拓扑排序的实现,图的定义、邻接矩阵和邻接表、DFS和BFS(广度优先遍历和深度优先遍历)

m0_73569204的博客 1338

java克鲁斯卡尔算法_最小生成树----克鲁斯卡尔算法----java版

踉踉跄跄写出来了,原理我基本懂了,但是感觉有点讲不出来,这里只贴一下代码: 图如上:package cn.nrsc.graph;/**** @author 孙川 最小生成树-克鲁斯卡尔算法**/public class Graph_Kruskal {// ------ 边实体----------class Edge {private int begin;private int end;privat...

weixin_39899226的博客 223

五、最小生成树——克鲁斯卡尔(Kruskal)算法

现在我们来换一种思考方式,普里姆(Prim)算法是以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树的。这就像是我们如果去参观某个展会,例如世博会,你从一个入口进去,然后找你所在位置周边的场馆中你最感兴趣的场馆观光,看完后再用同样的办法看下一个。可我们为什么不事先计划好,进园后直接到你最想去的场馆观看呢? 同样的思路,我们也可以直接就以边为目标去构建,因为权值是在边上,直接去找最小权值的边来构建生成树也是很自然的想法,只不过构建时要考虑是否会形成环路而已。此时我们就...

ThinPikachu的博客 5336

克鲁斯卡尔算法生成最小生成树

克鲁斯卡尔算法的介绍 1)克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法。 2)基本思想:按照权值从小到大的顺序选择 n-1条边,并保证这 n-1条边不构成回路 3)具体做法:首先构造一个只含 n个顶点的森林,然后依权值从小到大从连通网中选择边加入到森林中,并使森林中不产生回路,直至森林变成一棵树为止 首先我们得明白,在解决求最小生成树的算法里,主要就是克鲁斯...

interesting_code的博客 1万+
上一篇: Kosaraju算法解析及Java代码实现(附图)
下一篇: Prim算法解析及Java代码实现(附图)
SpringRolls
博客等级 码龄9年 73粉丝 129原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值