Prim算法和Kruskal算法

prim算法(普里姆算法)详解 prim算法(普里姆算法)详解 了解了什么是最小生成树后,本节为您讲解如何用普里姆(prim)算法查找连通网(带权的连通图)中的最小生成树。 普里姆算法查找最小生成树的过程,采用了贪心算法的思想。对于包含 N 个顶点的连通网,普里姆算法每次从连通网中找出一个权值最小的边,这样的操作重复 N-1 次,由 N-1 条权值最小的边组成的生成树就是最小生成树。 那么,如何找出 N-1 条权值最小的边呢?普里姆算法的实现思路是: 将连通网中的所有顶点分为两类(假设为 A 类和 B 类)。初始状态下,所有顶点位于 B 阅读详情

  Prim算法和Kruskal算法都能从连通图找出最小生成树。区别在于Prim算法是挨个找,而Kruskal是先排序再找。

 

    一、Prim算法:

    Prim算法实现的是找出一个有权重连通图中的最小生成树,即:具有最小权重且连接到所有结点的树。(强调的是树,树是没有回路的)。

    Prim算法是这样来做的: 

    首先以一个结点作为最小生成树的初始结点,然后以迭代的方式找出与最小生成树中各结点权重最小边,并加入到最小生成树中。加入之后如果产生回路则跳过这条边,选择下一个结点。当所有结点都加入到最小生成树中之后,就找出了连通图中的最小生成树了。

 

    Prim算法最小生成树查找过程:

 


 

C语言实现:

 

C代码  收藏代码
  1. #include <stdio.h>  
  2.   #include <stdlib.h>  
  3.   #define maxint 1073741824  
  4.   int main()  
  5.   {  
  6.   FILE *input=fopen("input.txt","r"),*out=fopen("output.txt","w");  
  7.   int n,m,i,j,x,y,w;  
  8.   fscanf(input,"%d %d",&n,&m);  
  9.   int map[n][n],E[m][3],tree[m],Mst[n][n];  
  10.   /*Mst表示最小生成树的邻接矩阵,map是原图,E是边集,其中E[0]和E[1]是边的两个顶点,E[2]是边的权值,tree是用于判断原图的点是否在最小生成树中*/  
  11.   memset(tree,0,sizeof(tree));  
  12.   for(i=0; i<n; i++)  
  13.   {  
  14.   for(j=0; j<n; j++)  
  15.   {  
  16.   map[i][j]=maxint;  
  17.   Mst[i][j]=maxint;  
  18.   }  
  19.   E[i][0]=E[i][1]=maxint;  
  20.   }  
  21.   for(i=0; i<m; i++)  
  22.   {  
  23.   fscanf(input,"%d %d %d",&x,&y,&w);  
  24.   if(w<map[x][y])  
  25.   {  
  26.   map[x][y]=w;  
  27.   map[y][x]=w;  
  28.   }  
  29.   }  
  30.   int min=maxint,next=0,now=0,k=0;  
  31.   tree[0]=1;  
  32.   for(i=0; i<n; i++)  
  33.   {  
  34.   for(j=0; j<n; j++)  
  35.   {  
  36.   if(map[now][j]!=maxint && tree[j]==0)  
  37.   {  
  38.   E[k][0]=now;  
  39.   E[k][2]=map[now][j];  
  40.   E[k++][1]=j;  
  41.   }  
  42.   }  
  43.   for(j=0; j<k; j++)  
  44.   {  
  45.   if(E[j][2]<min && tree[E[j][1]]==0)  
  46.   {  
  47.   min=E[j][2];  
  48.   x=E[j][0];  
  49.   y=E[j][1];  
  50.   next=y;  
  51.   }  
  52.   }  
  53.   tree[next]=1;  
  54.   now=next;  
  55.   Mst[x][y]=map[x][y];  
  56.   Mst[y][x]=map[y][x];  
  57.   min=maxint;  
  58.   }  
  59.   for(i=0; i<n; i++)  
  60.   {  
  61.   for(j=0; j<n; j++)  
  62.   {  
  63.   if(Mst[i][j]==maxint) //判断两点是否连通  
  64.   fprintf(out,"00 "); //美化输出,不必多加探究  
  65.   else  
  66.   {  
  67.   fprintf(out,"%d ",Mst[i][j]); //输出生成树的邻接矩阵,要输出树的自己可以根据邻接矩阵的数据进行加工  
  68.   }  
  69.   }  
  70.   fprintf(out,"\n");  
  71.   }  
  72.   fclose(input);  
  73.   fclose(out);  
  74.   return 0;  
  75.   } // 程序未考虑不是连通图的情况,修改很简单,判断生成树的节点数量是否等于原图的节点数量  
  76.   //如果小于(不会有大于)则本图不是连通图  
  77.   //其实prim和迪杰斯特拉算法核心有相似之处  
 

 注意:
     
若候选轻边集中的轻边不止一条,可任选其中的一条扩充到T中。
     连通网的最小生成树不一定是惟一的,但它们的权相等。
【例】在上图(e)中,若选取的轻边是(2,4)而不是(2,1)时,则得到如图(h)所示的另一棵MST。
    
算法特点
     该算法的特点是当前形成的集合T始终是一棵树。将T中U和TE分别看作红点和红边集,V-U看作蓝点集。算法的每一步均是在连接红、蓝点集的紫边中选择一条轻边扩充进T中。MST性质保证了此边是安全的。T从任意的根r开始,并逐渐生长直至U=V,即T包含了 C中所有的顶点为止。MST性质确保此时的T是G的一棵MST。因为每次添加的边是使树中的权尽可能小,因此这是一种"贪心"的策略。
算法分析
     该算法的时间复杂度为O(n2)。与图中边数无关,该算法适合于稠密图。

算法演示:

http://sjjp.tjuci.edu.cn/sjjg/DataStructure/DS/web/flashhtml/prim.htm


    二、Kruskal算法:

    Kruskal算法与Prim算法的不同之处在于,Kruskal在找最小生成树结点之前,需要对所有权重边做从小到大排序。将排序好的权重边依次加入到最小生成树中,如果加入时产生回路就跳过这条边,加入下一条边。当所有结点都加入到最小生成树中之后,就找出了最小生成树。

 

C语言实现:

 

C代码  收藏代码
  1. /* Kruskal.c 
  2.   Copyright (c) 2002, 2006 by ctu_85 
  3.   All Rights Reserved. 
  4.   */  
  5.   /* I am sorry to say that the situation of unconnected graph is not concerned */  
  6.   #include "stdio.h"  
  7.   #define maxver 10  
  8.   #define maxright 100  
  9.   int G[maxver][maxver],record=0,touched[maxver][maxver];  
  10.   int circle=0;  
  11.   int FindCircle(int,int,int,int);  
  12.   int main()  
  13.   {  
  14.   int path[maxver][2],used[maxver][maxver];  
  15.   int i,j,k,t,min=maxright,exsit=0;  
  16.   int v1,v2,num,temp,status=0;  
  17.   restart:  
  18.   printf("Please enter the number of vertex(s) in the graph:\n");  
  19.   scanf("%d",&num);  
  20.   if(num>maxver||num<0)  
  21.   {  
  22.   printf("Error!Please reinput!\n");  
  23.   goto restart;  
  24.   }  
  25.   for(j=0;j<num;j++)  
  26.   for(k=0;k<num;k++)  
  27.   {  
  28.   if(j==k)  
  29.   {  
  30.   G[j][k]=maxright;  
  31.   used[j][k]=1;  
  32.   touched[j][k]=0;  
  33.   }  
  34.   else  
  35.   if(j<k)  
  36.   {  
  37.   re:  
  38.   printf("Please input the right between vertex %d and vertex %d,if no edge exists please input -1:\n",j+1,k+1);  
  39.   scanf("%d",&temp);  
  40.   if(temp>=maxright||temp<-1)  
  41.   {  
  42.   printf("Invalid input!\n");  
  43.   goto re;  
  44.   }  
  45.   if(temp==-1)  
  46.   temp=maxright;  
  47.   G[j][k]=G[k][j]=temp;  
  48.   used[j][k]=used[k][j]=0;  
  49.   touched[j][k]=touched[k][j]=0;  
  50.   }  
  51.   }  
  52.   for(j=0;j<num;j++)  
  53.   {  
  54.   path[j][0]=0;  
  55.   path[j][1]=0;  
  56.   }  
  57.   for(j=0;j<num;j++)  
  58.   {  
  59.   status=0;  
  60.   for(k=0;k<num;k++)  
  61.   if(G[j][k]<maxright)  
  62.   {  
  63.   status=1;  
  64.   break;  
  65.   }  
  66.   if(status==0)  
  67.   break;  
  68.   }  
  69.   for(i=0;i<num-1&&status;i++)  
  70.   {  
  71.   for(j=0;j<num;j++)  
  72.   for(k=0;k<num;k++)  
  73.   if(G[j][k]<min&&!used[j][k])  
  74.   {  
  75.   v1=j;  
  76.   v2=k;  
  77.   min=G[j][k];  
  78.   }  
  79.   if(!used[v1][v2])  
  80.   {  
  81.   used[v1][v2]=1;  
  82.   used[v2][v1]=1;  
  83.   touched[v1][v2]=1;  
  84.   touched[v2][v1]=1;  
  85.   path[0]=v1;  
  86.   path[1]=v2;  
  87.   for(t=0;t<record;t++)  
  88.   FindCircle(path[t][0],path[t][0],num,path[t][0]);  
  89.   if(circle)  
  90.   {/*if a circle exsits,roll back*/  
  91.   circle=0;  
  92.   i--;  
  93.   exsit=0;  
  94.   touched[v1][v2]=0;  
  95.   touched[v2][v1]=0;  
  96.   min=maxright;  
  97.   }  
  98.   else  
  99.   {  
  100.   record++;  
  101.   min=maxright;  
  102.   }  
  103.   }  
  104.   }  
  105.   if(!status)  
  106.   printf("We cannot deal with it because the graph is not connected!\n");  
  107.   else  
  108.   {  
  109.   for(i=0;i<num-1;i++)  
  110.   printf("Path %d:vertex %d to vertex %d\n",i+1,path[0]+1,path[1]+1);  
  111.   }  
  112.   return 1;  
  113.   }  
  114.   int FindCircle(int start,int begin,int times,int pre)  
  115.   { /* to judge whether a circle is produced*/  
  116.   int i;  
  117.   for(i=0;i<times;i++)  
  118.   if(touched[begin]==1)  
  119.   {  
  120.   if(i==start&&pre!=start)  
  121.   {  
  122.   circle=1;  
  123.   return 1;  
  124.   break;  
  125.   }  
  126.   else  
  127.   if(pre!=i)  
  128.   FindCircle(start,i,times,begin);  
  129.   else  
  130.   continue;  
  131.   }  
  132.   return 1;  
  133.   }  
 

算法描述:克鲁斯卡尔算法需要对图的边进行访问,所以克鲁斯卡尔算法的时间复杂度只和边又关系,可以证明其时间复杂度为O(eloge)。

算法过程:

1.将图各边按照权值进行排序

2.将图遍历一次,找出权值最小的边,(条件:此次找出的边不能和已加入最小生成树集合的边构成环),若符合条件,则加入最小生成树的集合中。不符合条件则继续遍历图,寻找下一个最小权值的边。

3.递归重复步骤1,直到找出n-1条边为止(设图有n个结点,则最小生成树的边数应为n-1条),算法结束。得到的就是此图的最小生成树。


克鲁斯卡尔(Kruskal)算法因为只与边相关,则适合求稀疏图的最小生成树。而prime算法因为只与顶点有关,所以适合求稠密图的最小生成树。



 无疑,Kruskal算法在效率上要比Prim算法快,因为Kruskal只需要对权重边做一次排序,而Prim算法则需要做多次排序。尽管Prim算法每次做的算法涉及的权重边不一定会涵盖连通图中的所有边,但是随着所使用的排序算法的效率的提高,Kruskal算法和Prim算法之间的差异将会清晰的显性出来。

Kruskal算法和Prim算法 Kruskal算法和Prim算法 在无向图中,连通且不含圈的图称为树。给定一个无向图G=(V,E),连通G中所有点,且边集使E的子集的树称为G的生成树,其中权值最小的生成树称为最小生成树(MST)。构造MST的算法有很多,最常见的即是Kruskal算法和Prim算法。 Kruskal算法 ... 阅读详情

相关推荐

Prim和Kruskal算法之C++实现

最近好长时间都困惑在这两个算法中,其实也不难,就是写的时候比较费劲。现在总结一下。 首先说一下两个算法是干嘛呢? 都是求解一个无向图G的最小生成树(minimum spanning tree),就是由该图的那些连接G的所有顶点的边构成的树,其总值最低。这里很重要一点就是要求G是连通的。 克鲁斯卡尔(Kruskal)算法因为只与边相关,则适合求稀疏图的最小生成树。而prime算法因为只与顶点有关

好记性不如烂笔头的专栏 4611

prim算法

prim算法 prim算法(普利姆算法):对图G(V,E)设置集合S,存放已访问的顶点,然后每次从集合V-S中选择与集合S的最短距离最小的一个顶点(记为u),访问并加入集合S。之后,令顶点u为中介点,优化所有从u能到达的顶点v与集合S之间的最短距离。执行n次(n为顶点个数),直到集合S已包含所有顶点。 算法实例演示 首先让我们来看一个example。如下图所示,图a是一个连通图(右图是图a对应的邻接矩阵,假设图中的边的权值大于0),我们现在基于该图来演示Prim算法的过程。 我们选择一个起点,然后在与起

qq_36314864的博客 3万+

Prim算法和Kruskal算法模板

void createGraph(){ //lowcost表示每个点的最小花费,closet表示最小花费对应相连的点,visited区分两个集合 memset(graph,0,sizeof(graph)); memset(lowcost,0,sizeof(lowcost)); memset(closet,0,sizeof(closet)); memset(v

Tyshawn的博客 1933

最小生成树-Prim算法和Kruskal算法

Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为最小。该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:Vojtěch Jarník)发现;并在1957年由美国计算机科学家罗

不积跬步无以至千里 10万+

算法——Prim算法

Prim算法是一种用于求解图的最小生成树的算法。该算法得名于美国计算机科学家罗伯特·普林姆(Robert C. Prim)。Prim算法的基本思想是从一个起始节点开始,并选择与当前生成树相连的边中权值最小的边,然后将该边加入到生成树中,再选择下一条权值最小的边,直到生成树覆盖了所有节点为止。祝您好运!

百锦再的博客 1万+

【数据结构】克鲁斯卡尔(Kruskal)算法 —PK— 普里姆(Prim)算法

求图的最小生成树的典型算法:克鲁斯卡尔(Kruskal)算法;普里姆(Prim)算法。考虑问题的出发点相同:为使生成树上边的权值之和达到最小,则应使生成树中每一条边的权值尽可能的小。

四季轮换叶,一路招摇胜 1万+

Prim算法、Kruskal算法

文章目录Prim算法Kruskal算法 主要内容: Prim算法 最小生成树对应的问题一般都是无向图,最小生成树所构成的图总边权之和最小,但不能是环,否则不能称之为"最小"。 Prim算法是求解最小生成树的算法之一,适用于稠密图,Prim算法和Dijkstra算法步骤很相似,不同的是Dijkstra需要更新所有邻居到起点的距离,也就是"松弛操作",但Prim不需要,只需要把距离集合最近的点加...

ker的博客 5428

告别深度学习!用5个麦克风搞定多说话人分离:ReTM算法保姆级教程

本文详细介绍了ReTM算法,这是一种无需深度学习、仅需5个麦克风即可实现多说话人语音分离的创新信号处理方法。它通过估计相对传递矩阵,利用空间物理信息在混响环境中分离语音,具有数据需求低、计算复杂度小、无需先验几何信息等优势,特别适合嵌入式设备和资源受限场景。

desk3的博客 156

图论算法——Prim算法和Kruskal算法

引言 我们要学习的第一种计算最小生成树的算法,它每一步都会为一颗生长中的树添加一条边。 下面分析下算法思路 思路 一开始这棵树只有一个顶点,然后会向它添加V-1条边,每次总是将下一条连接树中的顶点与不在树中的顶点且权重最小的边加入树中。 每次当我们向(生成)树中添加了一条边之后,也向树中添加了一个顶点。要维护一个包含所有横切边的集合,就要将连接这个顶点和其他所有不在树中的顶点的边加入优先队列。要注...

日积月累,天道酬勤 1732

Redis简介和项目应用

内存优先架构简介Redis的读写操作都是在内存中执行的,计算机内存的读写速度极快,比机械硬盘的读写快很多,因此也会比MySql采用机械读写的方式性能更高。但是这样会产生一个问题,当Redis重启之后,内存中的数据就会丢失,为了保证数据不会因为服务器重启而丢失,Redis实现了数据持久化的机制,这个机制会把数据存储到磁盘中,当服务器重启的时候,能够从磁盘中恢复原有的数据。

人工智能、机器学习 757

Jenkins中文显示不全?三步搞定Locale插件+汉化包的正确安装姿势

本文针对Jenkins界面中文显示不全问题,提供从原理到实战的深度解决方案。文章详细解析了Locale插件与中文语言包的核心机制,并分步指导如何通过配置JVM环境、正确安装插件及执行深度排查,彻底解决汉化顽疾,实现Jenkins界面的完美中文显示。

weixin_42611310的博客 259

prim算法 kruskal算法

如果是二维数组,来记录两个点链接,例如 parent[节点编号A][节点编号B] = 1 ,parent[节点编号B][节点编号A] = 1,来表示节点A与节点B相连,那就没有上面说的这个注意事项了,当然这么做的话,就是多开辟的内存空间。我在图中,特别把每条边的权值对应的是哪两个节点标记出来(例如minDist[7]=1,对应的是节点5和节点7之间的边,而不是节点6和节点7),为了就是让大家清楚,minDist里的每一个值对应的是哪条边。如果 一个图中,节点多,但边相对较少,那么使用Kruskal 更优。

波风水门的博客 889

微信本地数据解密实战:从AES加密原理到EnMicroMsg.db恢复指南

数据加密是保障信息安全的核心技术,其中对称加密算法AES因其高效可靠,被广泛应用于各类本地数据保护场景。其原理是通过特定密钥对数据进行混淆转换,确保未经授权者无法读取原始内容。在移动应用领域,本地数据库加密对于保护用户隐私、防止数据泄露具有重要价值。微信作为国民级应用,对其本地存储的聊天记录数据库(EnMicroMsg.db)采用了基于设备标识和用户UIN生成的AES-256-CBC加密方案。理解这一机制,不仅有助于在合法合规前提下进行个人数据备份与恢复,也为开发者进行客户端安全分析、兼容工具开发提供了基础

weixin_30764883的博客 565

实现、比较和改进Prim算法和Kruskal算法

Prim算法和Kruskal算法是两种常用的最小生成树(MST)算法。Prim算法从一个顶点开始,逐步扩展生成树,每次选择与当前生成树相连的最小权重边。Kruskal算法则从所有边中选择最小权重的边,确保不形成环,直到覆盖所有顶点。

星途码客的博客 1781

PyCharm与MicroPython联手:打造高效ESP32开发环境

本文详细介绍了如何使用PyCharm与MicroPython打造高效的ESP32开发环境。通过配置PyCharm插件、刷写MicroPython固件以及实战示例,帮助开发者快速上手嵌入式Python开发,显著提升物联网项目的开发效率。

weixin_29169899的博客 380

【思考模型框架】采用双钻模型:发散(桌面研究/用户访谈)→收敛(需求归类/优先级排序),输出需求规格书、追踪矩阵及产品待办清单。

设计思维双钻模型是一种以用户为中心的需求管理方法,通过"发散-收敛"的双循环确保问题定位准确、方案切实可行。第一钻石(探索→定义)聚焦"找对问题",运用用户访谈、田野调查等方法挖掘真实需求;第二钻石(开发→交付)解决"做对方案",通过原型测试、A/B测试验证可行性。该模型强调低保真验证、多团队协作和真实用户测试,避免资源浪费与伪需求开发。典型应用场景包括产品功能优化、用户体验提升等需要精准落地的需求场景。核心价值在于建立从用户痛点到解决方案的可控闭

奶爸的编程之路,也就一周冷个三天 315

Kruskal 算法与 Prim 算法

一:无向带权图的最小生成树 无向带权图是图论算法领域中的一种基础模型。它的代码实现我们就不在这篇文章中介绍了,大家可以参考文章后面给出的代码链接。下图为一个无向带权图的示例: 接下来我们着重介绍一下图的生成树与最小生成树的概念。 什么是图的生成树呢? 首先,只有一个联通图才有会有图的生成树,也就是说,给定的图的联通分量的个数必须是 1 。 然后,在一个联通图 GGG 中,如果取它全部顶点和一部分边构成一个子图 G′G'G′,若子图 G′G'G′ 的所有边能够使得全部的顶点联通且不形成任何的回路,则称子图

qq_39749300的博客 3076

运维系列【仅供参考】:RustDesk部署疑难解答

RustDesk部署疑难解答

weixin_54626591的博客 279

prim算法和kruskal算法详解

在我们的数据结构中,当涉及到图的寻找最小的路径时,不得不提到最经典的寻找图的最小生成树的算法: prim算法和kruskal算法详解。下面笔者将与大家共同探讨一下这两个经典的算法和他们的C++代码实现。 首先我们先看引自百度百科的prim算法的定义:普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英...

陌意随影的博客 2141

Qt入门教程【Core篇】singal and slot信号与槽

Qt中信号与槽singal and slot

小鱼酱的博客 2448

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【数据结构】图论——Prim算法和Kruskal算法

图论 、Prim算法和Kruskal算法

ChenZHIHAO_y的博客 1905

SAP B1中文培訓教材_SDK

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

Prim算法和Kruskal算法理解

一:Prim算法 Prim算法的实现就是通过搜索来实现的,首先找一个起始点a,然后找与起始点相关联的所有的点中离a最近的点b,并且把这个点融入最小生成树中,然后再比较与b相关联的点和与a相关联的点的距离,若可以更新点,则更新然后继续找! 拿一道poj的题来说 You are assigned to design network connections between certain

qq_40843412的博客 4162

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

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

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

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

Prim算法 Kruskal算法 简述

Prim算法和Kruskal算法,都是用来找出图中最小生成树的算法,两个算法有些小差别。 Prim算法 又称普里姆算法,以图上的顶点为出发点,逐次选择到最小生成树顶点集距离最短的顶点为最小生成树的顶点,并加入到该顶点集,直到包含所有的顶点。 步骤: 1.选择一出发点,加入集合A。 2.遍历与集合A中的点相邻的边,找到最短的边,并且不构成回路。 3.将步骤2得到的边的目标点加入集合A

新手村 6829

Prim算法和Kruskal算法比较

Prim算法与Kruskal算法都是用来求连通网的最小生成树问题的方法。首先让我们来创设一个情景: 某营业厅接到一个单子,要求给一所学校新建校区安装宽带 该学校教学楼、宿舍分别用(A, B, C, D, E, F, G)来代表 问:如何修路保证各个站点都能连通,并且线路最短 Prim算法 1).输入:一个加权连通图,其中顶点集合为V,边集合为E; 2).初始化:Vnew = {x},其中x为集合V中的任一节点(起始点),Enew = {},为空; 3).重复下列操作,直到Vnew = V: a.在集

小缪的博客 4058

实验13 prim算法和kruskal算法

实验13 prim算法和kruskal算法(含图解)

知识库搭建ing 1528
上一篇: 迭代与递归的区别
下一篇: 在myeclipse中连接mysql查询数据
黄玮鹏
博客等级 码龄17年 262粉丝 20原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值