图的应用(最小生成树、最短路径、拓扑排序、关键路径)

算法与数据结构【30天】集训营——图的应用之最小生成树、最短路径、拓扑排序、关键路径(29) 现实生活中的许多问题都可以转化为图来解决。 例如, 如何以最小成本构建一个通信网络,如何计算地图中两地之间的最短路径,如何为复杂活动中各子任务的完成寻找一个较优的顺序等。 本文将结合这些常用的实际问题,介绍图的几个常用算法,包括最小生成树,最短路径、拓扑排序和关键路径算法。 阅读详情

1.最小生成树

一个连通图的生成树是指一个极小连通子图,它含有图中的全部顶点,但只有足以构成一棵树的 n-1 条边。在一个连通网的所有生成树中,各边代价之和最小的那棵生成树称为该连通网 最小代价生成树(MST),简称为 最小生成树。利用普里姆(Prim)算法和克鲁斯卡尔(Kruscal)算法可以生成一个连通网的最小代价生成树,它们都是基于贪心算法策略。

1.1. 普里姆(Prim)算法

(1).基本步骤

假设N=(V,{E})是连通网,TE为最小代价生成树中边的集合。
① 初始U={u0}(u0∈V),TE=空集;
② 在所有u∈U,v∈V-U的边中选一条代价最小的边(u0,v0)并入集合TE,同时将v0并入U;
③ 重复②,直到U=V为止,此时必然存在n-1条边。

通俗点说就是:从一个顶点出发,在保证不形成回路的前提下,每找到并添加一条最短的边,就把当前形成的连通分量当做一个整体或者一个点看待,然后重复“找最短的边并添加”的操作。

这里有兄弟问过我为什么不需要判断环,哥们,咱动动脑子想想,形成环要什么条件?这里是两个集合,要形成环,两个顶点必须在一个集合里面,Prim算法显然不是的。

示例:在这里插入图片描述

(2).代码实现+注释

#include<iostream>
#include<vector>
using namespace std;
#define inf 0x7fffffff

typedef char VertexType;//图的顶点类型
typedef int ArcType;//边的权值类型

typedef struct {
	vector<VertexType> vex;//顶点表
	vector<vector<ArcType>> arc;//邻接矩阵 边表
	int vexNum, arcNum;//当前顶点数 边数
}MGraph;

//构造无向网:无向图权值为0或1即可
//			  有向网只赋值G[i][j]
void CreateUDG(MGraph& G) {
	cin >> G.vexNum >> G.arcNum;//图的顶点数和边数

	//顶点信息
	G.vex.resize(G.vexNum);
	for (int i = 0; i < G.vexNum; i++) cin >> G.vex[i];

	//初始化边信息
	vector<vector<ArcType>> arc(G.vexNum, vector<ArcType>(G.vexNum, inf));//赋值为无穷大
	G.arc = arc;

	//边信息
	VertexType vex1, vex2;
	int weight;
	for (int k = 0; k < G.arcNum; k++) {
		cin >> vex1 >> vex2 >> weight;//两顶点 权值
		int i = find(G.vex.begin(), G.vex.end(), vex1) - G.vex.begin();//vex1 vex2在图中的位置
		int j = find(G.vex.begin(), G.vex.end(), vex2) - G.vex.begin();
		G.arc[i][j] = G.arc[j][i] = weight;//建立对称弧
	}

}

//Prim算法生成最小生成树
//时间复杂度:O(n*n)即O(v*v)
void MiniSpanTree_Prim(MGraph G){
	int k, n = G.vexNum-1, mincost;//k用来记录下标 n用来记录循环遍历 mincost记录最小权值
	//adjvex保存相关顶点下标 这里从v0开始 即下标零开始 解释:adjvex[i] = j——> 第i个顶点与第j个顶点的弧 这里首先初始化所有点与顶点0的弧
	vector<int> adjvex(G.vexNum, 0);
	//lowcost保存顶点间边的权值 这里从v0开始 即下标零开始 初始化arc[0](将v0顶点与之组成的边的权值存入数组)lowcost[i] = j, adjvex[i] = k 
	//即顶点i和顶点k之间弧权值为j
	//就是保存已加入树的点 距离此点的最小权值
	vector<int> lowcost(G.arc[0]);
	//初始化第一个权值为0,即v0加入生成树
	//lowcost的值为0,在这里就是此下标的顶点已经加入生成树,也相当于一个标记
	lowcost[0] = 0;
	//这里也可以写一个标记数组标记节点是否已经加入生成树中
	//如vector<int> isJoin(G.vexNum, false);
	while (n--) {
		mincost = inf;//初始化最小权值为inf(无穷大)
		for (int i = 1; i < G.vexNum; i++) {
			if (lowcost[i]!=0&&lowcost[i] < mincost) {//如果权值不为0且权值小于mincost 找除了已经存入树的顶点的最小权值
				mincost = lowcost[i];
				k = i;//记录当前下标
			}
		}
        cout<<k<<" ";
		cout << G.vex[adjvex[k]] << " " << G.vex[k] << endl;//打印当前顶点边中权值最小边的两顶点,即新加入生成树的一条边
		lowcost[k] = 0;//将当前顶点权值设置为0 表示此顶点已经加入生成树

		//再次循环遍历,找到未加入的节点以及与下标为k的结点相连的结点的权值与前面的比较,更小则进行覆盖
		for (int i = 1; i < G.vexNum; i++) {//若下标为k顶点各边权值小于此前这些顶点未被加入生成树的边权值则覆盖原本lowcost并且建立弧关系
			//lowcost[i] = j, adjvex[i] = k 
			//即顶点i和顶点k之间弧权值为j
			//就是保存已加入树的点 距离此点的最小权值
			if (lowcost[i] != 0&&G.arc[k][i] < lowcost[i]) {//这里lowcost[i]!=0没有实际意义 我这里加上就是提醒大家这里第i个顶点已经被加入 不会形成环 它是往外面找的
				lowcost[i] = G.arc[k][i];//将较小权值覆盖上一次权值 存入lowcost
				adjvex[i] = k;//弧建立关系 即下标为k的顶点与顶点i联系
			}
		}

	}
}

int main() {
	MGraph G;
	CreateUDG(G);
	MiniSpanTree_Prim(G);
	return 0;
}
6 10
A B C D E F
A B 6
C D 6
B C 3
D E 2
A E 5
A F 1
B F 5
C F 6
D F 4
E F 5
A F
F D
D E
F B
B C

1.2.克鲁斯卡尔(Kruscal)算法

(1).基本步骤

假设N=(V,{E})是连通网,将N中的边按权值从小到大的顺序排列。
① 将n个顶点看成n个集合。
② 按权值从小到大的顺序选择边,所选边应满足两个顶点不在同一个顶点集合内,将该边放到生成树边的集合中,同时将该边的两个顶点所在的顶点集合合并。
③ 重复②直到所有的顶点都在同一顶点集合内。
示例:
在这里插入图片描述

(2).代码实现+注释

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

typedef char VexType;

//边存储结构
typedef struct Edge {
	int begin;//起点序号
	int end;//尾点序号
	int weight;//权值
}Edge;

//图存储结构
typedef struct EdgeGraph {
	vector<VexType> vex;//顶点信息
	vector<Edge> arc;//边信息
	int vexnum, arcnum;//顶点数 边数

}EdgrGraph;

//权值升序
bool cmp(Edge e1,Edge e2) {
	return e1.weight < e2.weight;
}

//创建网
void Create_EdgeGraph(EdgeGraph& G) {
	cin >> G.vexnum >> G.arcnum;//输入顶点数和边数
	G.vex.resize(G.vexnum);//初始化顶点数组大小
	G.arc.resize(G.arcnum);//初始化边数组大小
	for (int k = 0; k < G.vexnum; k++) {
		cin >> G.vex[k];//输入顶点信息
	}
	VexType vex1, vex2;//两顶点
	int weight;//权值
	for (int k = 0; k < G.arcnum; k++) {//保存边信息
		cin >> vex1 >> vex2 >> weight;//输入边信息:两顶点 + 权值
		G.arc[k].begin = find(G.vex.begin(), G.vex.end(), vex1) - G.vex.begin();
		G.arc[k].end = find(G.vex.begin(), G.vex.end(), vex2) - G.vex.begin();
		G.arc[k].weight = weight;
	}
}

//Kruskar算法生成最小生成树
void MiniSpanTree_Kruskal(EdgeGraph G) {
	sort(G.arc.begin(), G.arc.end(), cmp);//按照权值升序
	vector<bool> vexset(G.vexnum, false);//节点是否已经存入树中
	for (int k = 0; k < G.arcnum; k++) {
		int i = G.arc[k].begin;
		int j = G.arc[k].end;
		if (!(vexset[i]&&vexset[j])) {//两顶点不在同一集合 不会形成环
			cout << G.vex[i] << " " << G.vex[j] << endl;
			vexset[i] = vexset[j] = true;
		}
	}
}

int main() {
	EdgeGraph G;
	Create_EdgeGraph(G);
	MiniSpanTree_Kruskal(G);
	return 0;
}
6 10
A B C D E F
A B 16
B C 5
B D 6
C D 6
D E 18
A E 19
A F 21
D F 14
E F 33
B F 11
B C
B D
B F
A B
D E

2.最短路径

RouterOS v7.6实战:5分钟搞定IPv6双栈配置(含光猫桥接避坑指南) 本文详细解析了在RouterOS v7.6系统中配置IPv6双栈网络的实战步骤,特别针对家庭网络光猫桥接模式下的常见问题提供了避坑指南。文章涵盖了从基础配置到企业级部署的进阶内容,包括IPv6前缀获取、DHCPv6客户端设置、路由通告以及安全优化,帮助用户充分利用v7.6版本在IPv6支持上的改进与优势。 阅读详情

相关推荐

HRNet 【demo 复现过程】

Deep High-Resolution Representation Learning for Human Pose Estimation

qq_45257495的博客 5556

【最小生成树模型】

最小生成树(Minimum Spanning Tree,简称MST)是图论中的经典问题之一,它在实际应用中有着广泛的应用。本文将介绍最小生成树模型的原理和应用,并通过一个实战项目来演示如何使用Python实现最小生成树算法。

武帝为此的博客 2094

HFSS - 双频微带天线设计与仿真

一、设计指标 中心频率:1.9GHz、2.45GHz 匹配情况:中心频率处S11S_{11}S11​参数小于-20dB 介质板厚度:1.6mm 介质板介电常数:3.8 馈电方式:50Ω\OmegaΩ同轴线馈电 二、双频微带天线 获得双频工作的一种最简单的方法是辐射贴片的长度对应-一个频率谐振,其宽度对应另一个频率谐振,然后从对角线的一角馈电,就能使同一个辐射贴片工作于两个频率上。其结构如下图所示。 从图中可以得知,x轴上的A点(x,0)为激发TM10_{10}10​模式的50Ω\OmegaΩ馈电点,由

MaxWei 1万+

最小生成树的基础应用

Prim&Kruskal的一个核心思想 Prim是每次选择距离最近的边,然后加进来; Kruskal是将边权升序排序,每次连接两个不连通的点; 那如何证明这样选择边是正确的? 这两个算法的证明思路都是一样的; 假设不选当前这条边,最终得到了一棵树,我们将当前这条边加上,必然会形成环;在这个环上,一定可以找出一条长度不小于(因为按两个算法,我们这条边都是最小的)当前边的边,我们用当前这条边去替换找到的这条边,结果一定不会变差(最坏不变,可能变小); 例题 Kruskal适用于稀疏图,Prim适用于稠

weixin_45724872的博客 3447

QMT Python API 实战指南:从安装到策略开发的完整流程

本文提供了一份详尽的QMT Python API实战指南,涵盖从环境配置到策略开发的完整流程。文章深入解析了xtdata行情模块与xttrader交易模块的核心架构与协作方式,并通过一个双均线策略实例,手把手教你如何获取数据、计算信号并执行交易,是量化交易开发者快速上手QMT Python接口文档的实用教程。

butter的博客 1416

AI编码的“黑箱危机”终结者:OpenSpec如何让你的代码从“猜谜”变“契约”?

OpenSpec的真正价值,在于它将AI编码从"经验驱动"推向"契约驱动"——当人类与AI对"目标是什么"达成显式共识,编码就从"猜谜游戏"变成了"工程实现"。这种转变不仅提升效率,更重塑了开发者与AI的关系:AI从"替代者"回归"协作者",而人类则聚焦于"定义正确的事"而非"正确地做事"。对于开发者,OpenSpec提供了驾驭AI的缰绳;对于团队,它构建了协作的基石;对于行业,它预示着AI编码工业化的开端。

haolove527的专栏 1348

最小生成树超详细介绍

最小生成树(Minimum Spanning Tree,简称MST,在一个连通的无向图,最小生成树是指包含图中所有顶点的一棵树,且该树的所有边的权重之和最小,关键在于树和最小两个关键。在上面的示例图中我们知道了生成的数是不能有闭环的,那么我们怎么去理解最小的意思。其实在每个点之间相连接的边中是有边的长度的,如下:我们需要找出的边构成生成树,并且包含图中的所有顶点,使得边的权重之和最小。Kruskal更适合稀疏图,因为它按照边的权值排序,而不考虑顶点的度。Prim。

2301_80314483的博客 1万+

【3天快速入门WPF】从小白到新手入门教程

嘿,小伙伴们!如果你已经有一定的C#开发基础,但想快速掌握WPF开发,达到企业级水准,那接下来的这个三天快速入门计划绝对适合你!虽然听起来有点挑战,但别担心,只要跟着这个高强度、结构化的学习计划,你一定能搞定它。首先,我们得搞清楚,WPF的核心知识点到底有哪些。要想达到企业级开发水准,XAML、数据绑定、MVVM、控件使用、命令系统、样式模板这些统统都得拿下。听起来是不是有点多?别急,我们把任务分解到三天里,每天安排合理的内容,保证理论和实践相结合,让你学得扎实又高效。

Zy100Papa的博客 1422

最小生成树概念及其典型应用

生成树:包含所有顶点,但只包含部分边,因为要求树中不存在回路。 部分边不能多,也不能少,他少了,顶点就不能连接在一起了,它必须是连通的;它不能多,它随便找一条边就出现回路。 生成树共同特点: 顶点数相同; 极小:边的数目少得不能再少了,再少一条边,就不连通了,就不是连通的子图了 连通且没有回路,就必然n个顶点的生成树,一定有n-1条边。 既要连通,又要没有回路 有了n个顶点和n-1条边以后,生成树中任意两个顶点间路径是唯一的 反过来,n个顶点n-1条边是...

weixin_52634719的博客 3247

Spring AI 项目实战(十八):Spring Boot + AI + Vue3 + OSS + DashScope 实现高效语音识别系统(附完整源码)

本文介绍基于 Spring Boot AI 集成阿里云 OSS 与 DashScope 语音识别 API 的高效语音识别系统。该系统通过云端存储音频文件,解决传统本地存储的性能瓶颈与存储压力,支持同步 / 异步语音转文本,实现文件自动生命周期管理。文中详述技术选型、架构设计、核心代码实现(含前后端及配置)、部署流程,展现其高并发处理、可靠文件管理能力,适用于客服、教育等企业级场景,为语音识别应用提供实用解决方案。

博客 1537

Dify 第 4 篇 Dify 示例:数据库执行Agent

本文介绍了如何在Dify平台创建一个能够执行SQL查询的数据库Agent。通过安装并配置"通义千问"和"数据库"两个插件,实现自然语言到SQL语句的转换和执行。关键步骤包括:1)安装插件并配置API Key;2)设置默认数据库连接(建议使用只读账号);3)准备测试数据表结构。该Agent支持通过工具调用查询表结构、转换自然语言为SQL、执行查询并返回结果,同时提供了CSV查询和HTTP API接口功能。文中还提供了MySQL测试数据表的创建脚本和示例数据。

甘蓝的专栏 1156

【数据结构(30)】6.6 图的应用

严蔚敏版【数据结构】1. 生成树及其构造:生成树的特点、无向图的生成树。2.最小生成树:MST 性质、构造最小生成树:普里姆算法、克鲁斯卡尔算法。3.最短路径:迪杰斯特拉算法、弗洛伊德算法。4.拓扑排序:拓扑排序的方法、检测 AOV 网中是否存在环。5.关键路径:求解关键路径

shangguanxiu的博客 2396

[解决] PDF转图片,中文乱码或显示方框的解决方案

在Java开发中,将PDF文件转换为图片是一项常见的需求,但过程中可能会遇到中文乱码或显示方框的问题。本文将深入探讨这一问题,并提供详细的解决方案,帮助开发者顺利地完成PDF到图片的转换。

DazedMen的博客 1924

【数据结构】图的应用:最小生成树;最短路径;有向无环图描述表达式;拓扑排序;逆拓扑排序;关键路径

最小生成树;最短路径;有向无环图描述表达式;拓扑排序;逆拓扑排序;关键路径;Dijstra算法;Floyd算法

小人物,大梦想! 2151

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

图的应用:最小生成树;最短路径;有向无环图描述表达式;拓扑排序;关键路径

文章目录图的应用最小生成树Prim算法Kruskal算法最短路径有向无环图描述表达式拓扑排序关键路径 图的应用 最小生成树 图G的最小生成树T是G的所有生成树中边的权值之和最小的树 最小生成树:Minimum-Spanning-Tree,MST 性质: 最小生成树不是唯一的 最小生成树的边的权值之和是唯一的 最小生成树的边数为定点数减一 构成最小生成树的大多数算法利用了最小生成树的下列性质:假设G是一个带全联通的无向图,Y是顶点集V的一个非空子集。假设U是顶点集V的一个非空子集,假设有序对(u_0,v_

weixin_39280437的博客 784

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

数据结构图(图的定义+存储结构+图的遍历+图的应用(最小生成树、最短路径、拓扑排序、关键路径))

图的定义 有向图、无向图 简单图、多重图,区别:平行边和自环 有向完全图、无向完全图,相同点:该有的边或弧都有,区别:边和弧、n(n-1)/2、n(n-1) 极大连通子图、极小连通子图,相同点:无向图,连通图,区别:边 极大强连通子图、极小强连通子图,相同点:有向图、连通图,区别:边 连通分量、强连通分量,区别:有向图、无向图 生成树、生成森林 度、入度、出度 边的权和网,带权图即网 稠密图、稀...

xyl 2207

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

考研复习之数据结构笔记(十二)图(下)(图的应用,包含最小生成树、最短路径、拓扑排序、关键路径以及单元小结)

目录一、图的应用1.1 最小生成树(1)基本概念与问题引入(2)Prim(普里姆)算法(3)Kruskal(克鲁斯卡尔)算法1.2 最短路径(1)基本概念与问题引入(2)Dijkstra(迪杰斯特拉)算法(3)Flody(弗洛伊德)算法1.3 拓扑排序(1)基本概念与问题引入(2)相关实现1.4 关键路径(1)基本概念与问题引入(2)相关实现二、本章小结一个连通图的生成树包含图的所有顶点,并且只含尽可能少的边。即n个顶点n-1条边。问题引入: 图1.1-1 最小生成树问题引入最小生成树性质:算法基本过程:假

欢迎交流! 1129

考研数据结构之图的应用:最小生成树、最短路径、拓扑排序与关键路径

定义:无向连通图中,选取n-1条边连接所有顶点,且总权重最小的生成树。应用场景网络布线(如电力网、通信网)的最低成本设计。旅行商问题(TSP)的近似解法。定义:对有向无环图(DAG)的顶点进行线性排序,使得所有边均从排在前面的顶点指向后面的顶点。应用场景任务调度(如课程学习顺序、软件构建依赖)。代码编译中的依赖关系解析。定义:在带权有向无环图(AOE网)中,从源点到汇点的最长路径,决定整个工程的最短完成时间。应用场景项目管理中的进度优化(如建筑施工)。计算机流水线指令调度。

m0_73283053的博客 750

【数据结构】图的应用---最小生成树(Prim,Kruskal)、最短路径(BFS,Dijkstra,Floyd)、拓扑排序、关键路径、有向无环图表达式

最小生成树(Prim,Kruskal)、最短路径(BFS,Dijkstra,Floyd)、拓扑排序、关键路径、有向无环图表达式

m0_61628700的博客 1321

图的应用(最小生成树,最短路径,拓扑排序,关键路径)

1、最小生成树 1.1回顾生成数的概念 生成树的概念: 生成树要包含所有的顶点,那我们就可以对这个图进行遍历去访问它所有的顶点,遍历有深度优先与广度优先,在访问的过程中把访问的那些边加到生成树上。 例如: 1.2 最小生成树的概念与典型应用 最小生成树的概念 最小生成树的典型用途 1.3怎么找到无向网的最小生成树(利用MST性质) 1.4构造最小生成树方法一:Prim(普里姆)算法(利用了MST性质) U是放在生成树的顶点...

qq_52971866的博客 1208

图的应用:最小生成树、最短路径、拓扑排序、关键路径

最小生成树: 在图的所有生成树中,各边代价之和最小的那棵生成树称为最小代价生成树,简称最小生成树; 利用MST性质构造的算法:Prim、Kruskal Prim: 初始u为v1,找v1的权值最小的边,<v1,v3> 找与v1、v3连接的权值最小的边,<v3,v6> 找与v1,v3,v6连接的权值最小的边,<v6,v4> 找v1,v3,v6,v4连接的权值最小的边,<v3,v2> 找v1,v3,v6,v4,v2连接的权值最小的边,&lt..

weixin_46432495的博客 769

算法【图的应用-最小生成树-最短路径-拓扑排序-关键路径】

最小生成树 生成树的概念 无向图的生成树 最小代价生成树 最小生成树的典型用途 构造最小生成树算法 MST概念 普里姆算法(Prim) 克鲁斯卡尔算法(Kruskal) 两种算法比较 最短路径问题 第一类:求两点间的最短路径 第二类:某源点到其他各点的最短路径 最短路径算法 单源点最短路径:迪杰斯特拉算法(Dijistra) 所有顶点间最短路径:弗洛伊德算法(Floyd) 有向无环图应用 AOV网 特点 拓扑排序概念 拓扑排序的方法 拓扑排序的应用 AOE网 关键路径

huajian225的博客 1313

第六章第二节:图的遍历(广度优先遍历和深度优先遍历)和应用(最小生成树、最短路径、有向无环图的描述表达式、拓扑排序、关键路径)

教程:最小生成树。

123加油的博客 2294

数据结构——图的应用(最小生成树,最短路径,拓扑排序,关键路径)

目录1.最小生成树1.概念回顾——生成树 2.最小生成树概念 2.构造最小生成树 1.MST性质 2.Prim算法 3.Kruskal 算法4.两种算法比较 3.最短路径 1.两点间最短路径 2.某源点到其它各点最短路径 3.单源最短路径——用Dijkstra算法 4.所有顶点间的最短路径——Floyd算法 4.有向无环图及其应用 AOV网拓扑排序,AOE网关键路径AOV网 关键路径

2301_79431343的博客 624

十三、考研数据结构笔记——图的应用(最小生成树,最短路径,拓扑排序,关键路径)

本文主要列举考研中的图一些常考应用以及做题技巧 一、最小生成树 1.1 概念 1.2 性质 1.3 Prim算法 1.4 Kruskal 二、最短路径 BFS算法 Dijkstra算法 Floyld算法 有向无环图 三、拓扑排序 AOV网 拓扑排序 四、关键路径 AOE网及其性质 手算关键路径

Mr_GYF的博客 1578

ds图—最小生成树_图的应用

图的应用主要包括最小生成树,最短路径,拓扑排序和关键路径,这些知识点是考研的重要考点。下面对这些部分进行注意介绍:最小生成树这一个知识点在16年东大考研试卷中出现过,问的是最小生成树的定义是什么: 最小生成树的定义是:在图的生成树的集合中,权值和最小的那棵生成树就是最小生成树。最小生成树不唯一,但是权值和是唯一确定的,另外最小生成树的边数是顶点数减一。最小生成树算法有prim算法,prim算法 类...

weixin_39863161的博客 227
上一篇: [LeetCode]2309. 兼具大小写的最好英文字母
下一篇: [LeetCode]2315. 统计星号
天皓Oo
博客等级 码龄5年 337粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值