无向图的最小支撑树Kruskal算法的实现

最小支撑树MST 如果X本身是稀疏的,sparse(X)返回S。用法2:S = sparse(i,j,s,m,n,nzmax)——由i,j,s三个向量创建一个m*n的稀疏矩阵(上面的B矩阵形式),并且最多含有nzmax个元素。3)S = sparse(m,n)——sparse([],[],[],m,n,0)的缩写,生成一个m*n的所有元素都是0的稀疏矩阵。实验习题:已知六大城市:(Pe),(N),(Pa),(L),(T),(M),它们之间的交通网络数据如下表所示,求最小支撑树。3)对于有圈的,将这条边删除,否则,往下查找; 阅读详情

//                                 无向图的最小支撑树Kruskal算法的实现
//主题: 用邻接表的方式实现最小支撑树Kruskal算法

//作者:Andyhou

//时间:2008年4月28日

//具体算法实现:
//            采用的是最小堆的方式找最小边,用等价类的方式步步合并最小的边。
//            程序中还声明了一个等价类。
#include <iostream>
using namespace std;

const int MaxNode=100;
const int VISITED=1;
const int UNVISITED=0;
const int ROOT=-1;
const int INFINITY=9999;

struct Node
{
 int adjvex;           //终点顶点
 int weight;           //权
 struct Node *next;    //指向下个顶点的指针
};
class VNode
{
public:
 int data;
 struct Node* first;    //指向第一个邻接顶点
 VNode(){}
 VNode(int Data,struct Node* firstVal)
 {
  data=Data;
  first=firstVal;
 }
 VNode(struct Node* firstVal)
 {
  first=firstVal;
 }
 
};
//用于最小支撑树的边类
class Edge
{
public:
 int from,to,weight;
 Edge()
 {
  from=-1;
  to=-1;
  weight=0;
 }
 Edge(int f,int t,int w)
 {
  from=f;
  to=t;
  weight=w;
 }
 bool operator>(Edge oneEdge)
 {
  return weight>oneEdge.weight;
 }
 bool operator<(Edge oneEdge)
 {
  return weight<oneEdge.weight;
 }
 bool operator==(Edge oneEdge)
 {
  return weight==oneEdge.weight;
 }
};

//用于”父指针"发表示等价类的类
class Gentree
{
private:
 int *Array;
 int size;
public:
 Gentree(int sz)
 {
  size=sz;
  Array=new int[sz+1];
  for(int i=1;i<=sz;i++)
   Array[i]=ROOT;       //整个数的根节点
 }
 ~Gentree()
 {
  delete[] Array;
 }
 int FIND(int curr)       //寻找根的函数
 {
  while(Array[curr]!=ROOT)
   curr=Array[curr];
  return curr;
 }
 void UNION(int a,int b)  //将a和b合并到一个等价类中,a和b在一个等价类中就他们相同的根。
 {
  int root1=FIND(a);
  int root2=FIND(b);
  if(root1!=root2)
   Array[root2]=root1;
 }
 bool differ(int a,int b)  //判断a和b是否等价。
 {
  int root1=FIND(a);
  int root2=FIND(b);
  return root1!=root2;
 }
};


//最小值堆的建立
template <class T>
class MinHeap 
{
private:
 T* heapArray;
 int CurrentSize;
 int MaxSize;
 
public:
 MinHeap(const int n);
 virtual ~MinHeap()
 {delete []heapArray;};
 void BuildHeap();
 bool isLeaf(int pos) const;
 int leftchild(int pos) const;
 int rightchild(int pos) const;
 // Return parent position
 int parent(int pos) const;
 // 删除给定下标的元素
 bool Remove(int pos, T& node);
 void SiftDown(int left);
 //从position向上开始调整,使序列成为堆
 void SiftUp(int position);
 bool Insert(const T& newNode);
 T& RemoveMin();
 bool empty()
 {
  if(CurrentSize>0)
   return false;
  else
   return true;
 }
};

template<class T>
MinHeap<T>::MinHeap(const int n)
{
 if(n<=0)
  return;
 CurrentSize=0;
 MaxSize=n;
 heapArray=new T[MaxSize];
 BuildHeap();
}

template<class T>
void MinHeap<T>::BuildHeap()
{
 for (int i=CurrentSize/2-1; i>=0; i--)
  SiftDown(i);
}

template<class T>
bool MinHeap<T>::isLeaf(int pos) const
{
  return (pos>=CurrentSize/2)&&(pos<CurrentSize);
}

template<class T>
int MinHeap<T>::leftchild(int pos) const
{
 return 2*pos+1;      //返回左孩子位置
}

template<class T>
int MinHeap<T>::rightchild(int pos) const
{
 return 2*pos+2;      //返回右孩子位置
}

template<class T>
int MinHeap<T>::parent(int pos) const // 返回父节点位置
{
 return (pos-1)/2;
}

template<class T>
void MinHeap<T>::SiftDown(int left)
{
 //准备
 int i=left;       //标识父结点
 int j=2*i+1;      //标识关键值较小的子结点  
 T temp=heapArray[i];    //保存父结点
 //过筛
 while(j<CurrentSize)
 {
  if((j<CurrentSize-1)&&(heapArray[j]>heapArray[j+1]))
   j++;      //j指向右子结点
  if(temp>heapArray[j])
  {
   heapArray[i]=heapArray[j];
   i=j;
   j=2*j+1;
  }
  else break;
 }
 heapArray[i]=temp;
}

template<class T>
void MinHeap<T>::SiftUp(int position)
{//从position向上开始调整,使序列成为堆
 int temppos=position;
 T temp=heapArray[temppos];
 while((temppos>0)&&(heapArray[parent(temppos)]>temp))
 {
  heapArray[temppos]=heapArray[parent(temppos)];
  temppos=parent(temppos);
 }
 heapArray[temppos]=temp;
}

template<class T>
bool MinHeap<T>::Insert(const T& newNode)
{//向堆中插入一个结点
 if(CurrentSize==MaxSize)
  return false;
 heapArray[CurrentSize]=newNode;
 SiftUp(CurrentSize);
 CurrentSize++;
 return true;
}

template<class T>
T& MinHeap<T>::RemoveMin()
{
 if(CurrentSize==0)
 {
  cout<<"Can't Delete";

 }
 else
 {
  T temp=heapArray[0];     //取堆顶元素
  heapArray[0]=heapArray[CurrentSize-1]; //堆末元素上升至堆顶
  CurrentSize--;
  if(CurrentSize>1)
   SiftDown(0);      //从堆顶开始筛选
  return temp;
 }
}

template<class T>
bool MinHeap<T>::Remove(int pos, T& node)
{// 删除给定下标的元素
 if((pos<0)||(pos>=CurrentSize))
  return false;
 T temp=heapArray[pos];
 heapArray[pos]=heapArray[--CurrentSize]; //指定元素置于最后
 SiftUp(pos);        //上升筛
 SiftDown(pos);        //向下筛 
 node=temp;
 return true;
}

class ADJ
{
private:
 int e;                             //边数
 VNode *AdjList;                    //邻接表
 int NNode;                         //顶点数
 int MARK[MaxNode];                //访问标记数组
public:
 ADJ(int itE,int itMaxNode)
 {
  e=itE;
  NNode=itMaxNode;
  AdjList=new VNode[NNode+1];
  for(int i=0;i<NNode;i++)
  {
   AdjList[i].data=0;
   AdjList[i].first=NULL;
  }
 }
 ~ADJ()
 {
  delete[] AdjList;
 }
 void CreateAdj()
 {
  int i,j;
        int item;
  struct Node* S;
  for(int a=1;a<=NNode;a++)
  {
   cout<<"输入第"<<a<<"个顶点数据";
   cin>>AdjList[a].data;
   AdjList[a].first=NULL;
  }
  for(int k=0;k<e;k++)
  {
   cout<<"输入边<Vi,Vj>的顶点对序列号:";
   cin>>i;
   cin>>j;
   cout<<"输入边的权:";
   cin>>item;
            S=new struct Node();
   S->adjvex=j;
   S->weight=item;
   S->next=AdjList[i].first;   
   AdjList[i].first=S;          //连接两个顶点
   S=new struct Node();
   S->adjvex=i;
   S->weight=item;
   S->next=AdjList[j].first;
   AdjList[j].first=S;
  }
 }
 
 void printAll()
 {
  cout<<"打印所有顶点的连接情况;"<<endl;
  for(int i=1;i<=NNode;i++)
  {
   struct Node* temp=AdjList[i].first;
   cout<<i;
   cout<<"("<<AdjList[i].data<<")";
   if(temp!=NULL)
    cout<<"---"<<temp->weight<<"-->";
   while(temp!=NULL)
   {
    cout<<temp->adjvex;
    cout<<"("<<AdjList[temp->adjvex].data<<")"<<"--"<<temp->weight<<"-->";
    temp=temp->next;
   }
   cout<<"---->NULL";
   cout<<endl;
  }
  cout<<"输出了所有数据!"<<endl;
 }
 void AddEdgetoMST(Edge &E,Edge *MST,int tag)
 {
  MST[tag].from=E.from;
  MST[tag].to=E.to;
  MST[tag].weight=E.weight;
 }
 void Krushal();
 
};
void ADJ::Krushal()
{
 Gentree A(NNode);               //等价类
 MinHeap<Edge> H(e);             //最小值堆
 struct Node *temp;
 Edge * MST=new Edge[NNode-1];   //最小支撑树
 int MSTtag=1;                   //最小支撑树的边的标记 
 Edge Ne;
 for(int i=1;i<=NNode;i++)        //将图的所有边插入最小值堆H中
 {
  temp=AdjList[i].first;
  while(temp!=NULL)
  {
   if(i<temp->adjvex)      //因为是无向图,所有应防止重复插入
   {
    Ne.from=i;
    Ne.to=temp->adjvex;
    Ne.weight=temp->weight;
    H.Insert(Ne);
   }
   temp=temp->next;
  }
 }
 int EquNum=NNode;     //开始有|V|个等价类
 while(EquNum>1)          //合并等价类
 {
   Ne=H.RemoveMin();    //获得下一条权最小的边
   if(Ne.weight==INFINITY)
   {
    cout<<"不存在最小支撑树:";
    delete[] MST;
    MST=NULL;
    return ;
   }
   int from=Ne.from;           //纪录该条边的信息
   int to=Ne.to;
   if(A.differ(from,to))       //如果边Ne的两个顶点不在一个等价类
   {
    A.UNION(from,to);        //将边Ne的连个顶点在的两个等价类合并为一个
    AddEdgetoMST(Ne,MST,MSTtag++);  //将边e加到MST
    EquNum--;                       //将等价类的个数减1
   }
 }
 cout<<"输出无向图的最小支撑树的边和权:";
 for(int i=1;i<NNode;i++)
  cout<<MST[i].from<<"--"<<MST[i].to<<"("<<MST[i].weight<<")/t";
 cout<<endl;
}


int main()
{
 int E,MaxNode;
 cout<<"输入无向图的顶点数和边数::";
 cin>>MaxNode>>E;
 ADJ T(E,MaxNode);
 T.CreateAdj();
 T.printAll();
 cout<<endl;
 cout<<"Kruskal算法的执行:"<<endl;
 T.Krushal();
 return 0;
}

注:本程序在VC2005中编译成功的。

带权图的多种算法(有向图,无向图,Dijkstra算法,到每个顶点的最短距离算法,佛洛依德算法(Floyd),找出每对顶点的最短路径,带权重无向图最小生成树,prim算法,Kruskal算法求最小生成树)java实现,有注释 带权图的多种算法(有向图,无向图,Dijkstra算法,到每个顶点的最短距离,佛洛依德算法(Floyd),找出每对顶点的最短路径,带权重无向图最小生成树,prim算法,Kruskal算法求最小生成树)java实现, 有注释,简单轻松搞懂图,全部是自己实现, 立即下载

相关推荐

最小支撑树编程(最小生成树)

理解掌握Prim算法求赋权无向图的最小支撑树的理论及相关算法步骤。编程实现Prim法求赋权无向图的最小支撑树的问题。完美可运行,内有例题

【算法设计与分析】 最小生成树 kruskal(贪心算法)

【算法设计与分析】 最小生成树 kruskal(贪心算法) 【问题描述】 Kruskal算法解决的是带权重的无向图上连接所有顶点的耗费最小的生成树。使用最小堆数据结构寻找权值最小的边。 【输入形式】 在屏幕上输入顶点个数和连接顶点间的边的权矩阵。 【输出形式】 顺序输出按照贪心选择加入到MST中的每条边的顶点编号(编号小的在前)及权值。 【样例1输入】 8 0 15 7 0 0 0 0 10 15 0 0 0 0 0 0 0 7 0 0 9 12 5 0 0 0 0 9 0 0 0 0 0 0 0 12

weixin_46283740的博客 1430

硬盘dma读写过程

保护模式中,pci上的硬盘dma读写方法

481

[图论]Prim算法求最小支撑树和最短路径

Prim算法

让勤奋成为习惯 9805

「模型部署系列」ubuntu 使用vllm部署Qwen3-8B模型

解决这个问题的方法正如错误信息中所提示的,需要在命令行中显式地设置。下载单个文件到指定本地文件夹(以下载README.md到当前路径下“dir”目录为例)解决:这表明你正在使用的 Tesla T4 GPU 的计算能力为 7.5,而。,用于获取更详细的 NCCL 调试信息,当所有其他问题排除,可尝试增加。1、下载vllm v0.8.5(此处已经下好了,去仓库拉资源)在下载前,请先通过如下命令安装ModelScope。,这一错误最终致使引擎进程启动失败。更多更丰富的命令行下载选项,可参见。

汪依帆的博客 5046

ANSYS 有限元分析 支架拓扑优化设计 分析过程及常见问题解决

1.确定分析类型,所用模块包括两种 static structural Topology Optimization。3.通过草图建立几何模型,建好的几何模型如图1所示。2.工程材料采用默认的Q235。

m0_68737530的博客 1968

数据结构入门(7)——图的最短路径及最小支撑树

数据结构入门——图的最短路径及最小支撑树

博客 3176

78.在 Vue3 中使用 OpenLayers 实现地图地点搜索定位功能

本文详细介绍了如何在 Vue3 中集成 OpenLayers,实现地图地点搜索和定位功能。Vue3 项目环境的搭建与依赖安装。使用语法实现地图初始化和控件集成。通过 OpenLayers 的 Popup 和 Geocoder 插件,实现地址搜索和定位。希望这篇博文能帮助你快速掌握 Vue3 与 OpenLayers 的集成技术。如果在使用过程中遇到问题,欢迎在评论区留言讨论,或者参考 OpenLayers 官方文档获得更多帮助。注意。

小彭的博客 1854

用邻接表实现赋权无向图及Dijkstra算法求最短路径

用邻接表实现赋权无向图及Dijkstra算法求最短路径 图的表示法 常用的图的表示法可以分为邻接矩阵和邻接表。 邻接矩阵是一个i*j的二维数组,当i与j之间有边时标记为1,无边则为0。当边数较少时显然邻接矩阵会浪费大量空间。所以这边我们主要讨论邻接表。直接上代码: #include<bits/stdc++.h> #define maxx 10000 using namespace std; typedef struct lnode *glink; struct lnode{//邻接表节点

m0_51962511的博客 3448

【RT-DETR有效改进】为什么YOLO版本的RT-DETR训练模型不收敛精度差的问题

本文的内容同样为本专栏的前期预热文章,文章主要解释一下为什么有的人跑ultralytics仓库的RT-DETR精度很差,模型不收敛,mAP异常的情况。为了验证这一情况我也是跑了多个实验,从多个数据集出发,100-500的数据集我跑了大概5个数据集,1000的我跑了二个,2000的我跑了一个,4000的跑了一个,同时其中一些版本我也用了不同的batch_size来出发验证精度异常的情况。

Snu77的博客 9764

使用 YOLO26 的牙科全景X光片分析:从牙齿检测到疾病诊断

从数据预处理自动化、模型架构针对性优化到基于视觉特征的性能分析。它证明了在医学图像分析中,模型架构的进步(如YOLO26的特性)可以有效缓解数据不平衡和目标微小的问题,为临床自动化诊断提供了一个高效、可靠的解决方案。Python"""全局配置模块包含数据集路径、类别名称、论文复现参数、划分比例等常量"""import os# ==================== 路径配置 ====================

u012133341的博客 102

最小生成树kruskal算法(贪心算法)

【问题描述】Kruskal算法解决的是带权重的无向图上连接所有顶点的耗费最小的生成树。【输入形式】在屏幕上输入顶点个数和连接顶点间的边的权矩阵。【输出形式】顺序输出按照贪心选择加入到MST中的每条边的顶点编号(编号小的在前)及权值。【样例1输入】80 15 7 0 0 0 0 1015 0 0 0 0 0 0 07 0 0 9 12 5 0 0 0 0 9 0 0 0 0 00 0 12 0 0 6 0 00 0 5 0 6 0 14 80 0 0 0 0 14 0 310 0 0 0 0 8 3 0【样例

qq_57742913的博客 449

uniapp(安卓苹果app端) - 微信小程序分享提示报错“由于不支持的分享类型无法分享到微信“,“由于应用和小程序未绑定在同意微信开放平台账号,无法分享到微信“解决办法,uniapp小程序分享失败

uni-app,安卓app,苹果app,手机app端,苹果ios,安卓Android,移动端app,分享,微信分享,微信朋友圈,微信好友,转发,vue2,vue3,App端调用手机的系统分享,微信小程序,分享功能,原生app分享小程序到微信,可分享到微信、朋友圈等,报错,uniapp分享报错由于不支持的分享类型无法分享到微信,未审核应用,uniApp安卓苹果app报错由于应用和小程序未绑定在同意微信开放平台账号,无法分享到微信,微信appid,已经配置了,还是报错,无法解决,一直提示,APP_ID错误,打包

✅ 精选推荐文章 5513

7-5 最小支撑树 (10分)(Kruskal算法)

给定一个包含n个顶点的正权无向图,编号为0至n-1。请编写程序求出其最小支撑树,并计算其代价。 输入格式: 输入包含多组数据。每组数据第一行为2个整数n和e,均不超过200,分别表示图的顶点数和边数。接下来e行表示每条边的信息,每行为3个非负整数a、b、c,其中a和b表示该边的端点编号,c表示权值。各边并非按端点编号顺序排列。 输出格式: 对于每组数据,若存在最小支撑树则输出一个整数,为最小支撑树各边权值之和;若不存在最小支撑树,则输出“There is no minimum spanning tree.”

xxxibgdrgn博客 1591

快速生成2D卡通人物的AI工具:开启Live2D角色创作的新时代

随着这一创新工具的推出,我们正见证着Live2D角色创作进入了一个全新的阶段。它不仅极大地简化了角色设计的过程,也为广大创作者提供了一种全新的表达方式。对于那些渴望将脑海中的构思迅速转化为现实的人来说,这无疑是一大福音。现在就访问项目主页,开始探索无限可能吧!t=O83A项目主页https://human3daigc.github.io/Textoon_webpage/

这里汇聚了前沿的技术分享与实用的开发技巧,带你探索从创意到企业的技术创业之路。 4837

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

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

最小支撑树(最小生成树)

如下图所示,连通图G的某一无环两通子图T若覆盖G中所有的顶点,则称作G的一棵支撑树或生成树(spanning tree)。 其中顶点数为n,其边数为n-1。 如果其生成树中各边权值和最小,那么称其为最小生成树(可以不唯一)。 实现一 Prim算法 在图中G=(V;E)中,顶点集V的任一非平凡子集U及其补集V\U都构成G的一个割(cut),记作(U:V\U)。若边uv满足u属于U且...

Viator 1万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

数据结构:以Kruskal为例判断最小支撑树是否唯一

假设一个连通图。

m0_63997099的博客 1852

假人有限元模型

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

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

树的数据结构、最小支撑树(上)

树的数据结构、最小支撑树(上) – 潘登同学的图论笔记 文章目录树的数据结构、最小支撑树(上) -- 潘登同学的图论笔记无向树二叉树森林无向树理论部分无向树的等价定义支撑树最小支撑树构造最小生成树的算法Prim算法算法实现Kruskal算法 无向树 定义 树是连通且不含有任何简单回路的无向图 树中度数为1的顶点称为叶子,度数大于1的顶点称为分支点; 注: 一阶简单图k也是树 树必定不包含重边和自环,树一定是简单图 既然树是简单图,那么直接把图的数据结构拿过来用就行 二叉树 重点要介绍的是二叉树,二叉

weixin_52185313的博客 1499

数据结构:最小支撑树及图的应用

最小支撑树、最小生成树

m0_63997099的博客 1989

数据结构——最小支撑树

文章目录前言一、Prim算法(由小树长成大树)(1)思路(2)代码实现二、kruskal算法(合木成林)(1)思路(2)代码实现 前言 树:同时满足极小连通图与极大无环图 支撑树:能够覆盖图中每一个顶点的树 最小支撑树:有权网络中满足各边权值之和最小的支撑树 对于一幅图来说,存在的最小支撑树并不唯一。 一、Prim算法(由小树长成大树) (1)思路 最小支撑树总是会采用联结每一割的最短跨越边。 用我的理解,就是不断拓展树的大小,用贪心思想,在目前的最小支撑树的邻接点中搜索与树相连的边的最小权值,并

qq_52441682的博客 5027

破圈法求最小支撑树matlab_求解最优树——Prim算法与Kruskal算法

本文主要参考:1.《Matlab数学建模算法全收录(数学建模比赛必备参考资料).pdf》2.最小生成树-Prim算法和Kruskal算法1 前言简单来说,图由顶(就是结点)和边构成。不管如此,可以对边或者对顶赋权。 1.1 数学描述:数学结构G={V(G),E(G),fG)}。其中,G为二维平面的所涉及的元素的集合。V(G)表示该平面内已知点的集合。E(G)表示该平面内已知有向边的集合,对于...

weixin_30061835的博客 2095

【管理运筹学】第 7 章 | 图与网络分析(2,最小支撑树问题)

介绍了树的相关定义及定理,以及图论的一个经典问题:最小支撑树问题的三种解法。

Douglas的博客 2242

最小支撑树算法精讲:Kruskal与Prim原理、对比及管理场景实战

图论是描述事物间关系的基础数学模型,由顶点和带权重的边构成。最小支撑树(MST)是图论中的核心问题,旨在寻找连接所有顶点且总权重最小的无环子图,其原理基于贪心策略,确保每一步都做出局部最优选择。该技术具有极高的工程价值,能实现网络建设或资源连接的成本最优化。其经典应用场景包括通信网络规划、物流线路设计和市政管网布局等基础设施优化问题。本文聚焦于解决此问题的两大经典算法——Kruskal算法和Prim算法,通过对比其数据结构依赖(如并查集与优先队列)、时间复杂度和适用场景(稀疏图与稠密图),并结合管理运筹学中

ciqiaofu0192的博客 351

数据结构与算法分析--最小支撑树(图解Prim算法、Kruskal算法)

最小生成树算法:prim普利姆算法 Kruskal克鲁斯特拉算法。图解

weixin_58624886的博客 5001

算法1B----最小支撑树的两种算法实现思想(prim和kruskal)

算法1-B BST && BBST 二叉搜索树 平衡二叉树 从根开始 根据比较的大小,来决定是往左(左子树)还是往右(右子树) 逐级加深比较 越深的地方,所需要的比较次数也就越多,因此倾向于构造平衡、偏平的二叉树 Hashtable + Dictionary + Map 根据一个"名字",快速的找到一个元素 散列表,或哈希表 时间复杂度O(1) 哈希冲突:两个元素在同一个位置存储,此时会像拉链条一样往后存储 关键点,怎么取模? 取模值一般是散列表长度 一般是素数

Markland_l的博客 1147

最小支撑树算法详解:Kruskal与Prim的核心原理与应用场景

在计算机科学中,图论是研究网络结构的基础理论,而最小支撑树(Minimum Spanning Tree, MST)是图论中的一个经典优化问题。其核心原理是在一个带权连通图中,寻找一棵连接所有顶点且总权重最小的树,这体现了贪心算法的最优子结构特性。该问题的技术价值在于为网络设计、聚类分析等场景提供了高效的解决方案,例如在通信网络铺设、物流规划中,通过最小化连接成本实现全局连通。Kruskal算法采用全局贪心策略,通过排序边并利用并查集避圈;Prim算法则采用局部生长策略,使用优先队列维护当前树集与外界的最小边

weixin_34218579的博客 329
上一篇: 排序算法的实现
下一篇: 无向图的最小支撑树Prim算法的实现
Garyhou
博客等级 码龄20年 41粉丝 62原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值