如果一个图中所有点都是联通的,求最小树可以将图遍历完成,这里的最小是指边最少,跟边长没有关系。
算法利用深度优先遍历,记载每个遍历过的节点,将节点按照遍历顺序记录下来就是所谓的最小树。
关于深度优先遍历请参见深度优先遍历。
不过这里奇怪的是:
假如所有节点之间是双向联通的,只用生成一个数组,装入所有的节点,例如{'a','b','c','d','d'}
然后每两个点之间的线段就是最小树的结果,即a --> b, b --> c, c --> d, d --> e
似乎不用图这样复杂的结构支撑。
不过这里还是给出了按照图来产生最小树的办法。
Graph.mst:返回最小树。
Graph.main:提供简单测试。
代码如下:
class Stack {
private int[] values;
private int pos = -1;
Stack(int size) {
values = new int[size];
}
void push(int value) { values[++pos] = value; }
int pop() { return values[pos--]; }
int peek() { return values[pos]; }
boolean isEmpty() { return pos == -1; }
}
class Vertex {
private Object value;
private boolean isVisited;
Vertex(Object value) {
this.value = value;
}
void visit() { isVisited = true; }
void clean() { isVisited = false; }
boolean isVisited() { return isVisited; }
Object value() { return value; }
}
class Graph {
private Vertex[] vertexs;
private int[][] adjMat;
private int pos = -1;
Graph(int size) {
vertexs = new Vertex[size];
adjMat = new int[size][size];
}
void add(Object value) {
assert pos < vertexs.length;
vertexs[++pos] = new Vertex(value);
}
void connect(int from, int to) {
adjMat[from][to] = 1;
adjMat[to][from] = 1;
}
void connectAll() {
for(int i=0; i<= pos; i++)
for(int j=0; j<= pos; j++)
adjMat[i][j] = i^j&1;
}
int findNeighbor(int index) {
for(int i=0; i<=pos; i++) {
if(adjMat[index][i] == 1 && !vertexs[i].isVisited()) return i;
}
return -1;
}
Object[] mst(int index) { //从指定下标的节点开始生成最小数
if(vertexs[index] == null) return new Object[0]; //如果图中没有指定下标节点,则退出
Stack s = new Stack(vertexs.length); //创建栈记载访问过的节点的下标
Object[] result = new Object[pos+1]; //返回的结果
int i = 0;
vertexs[index].visit(); //访问0节点
result[i++] = vertexs[index].value();
s.push(index); //记录0节点
while(!s.isEmpty()) { //如果还有记录的节点则继续
index = findNeighbor(s.peek()); //寻找栈顶节点的未访问过的邻居
if(index != -1) { //如果找到
vertexs[index].visit(); //访问该节点
result[i++] = vertexs[index].value();
s.push(index); //记录该节点
} else s.pop(); //没有未访问过的节点,则出栈
} //如果栈未空则代表遍历完成
clean(); //清除所有访问标致
return result;
}
void clean() { for(Vertex v: vertexs) if(v != null)v.clean(); }
public static void main(String[] args) {
Graph g = new Graph(20);
g.add('a');
g.add('b');
g.add('c');
g.add('d');
g.add('e');
g.connectAll();
Object[] result = g.mst(0);
for(int i=0; i<result.length-1; i++) {
System.out.println(result[i] + " --> " + result[i+1]);
}
}
}
分享到:
相关推荐
此时,程序会输出一条消息:“所求最小树为:”,表明最小生成树已经成功构造,并且可以用于后续的分析和应用。 ### 实际应用 在实际应用中,最小生成树能够解决多种优化问题,其价值不可估量。以城市间道路规划为例...
标题中的“小树卡通PPT背景图片.zip”表明这是一个包含卡通风格的小树图案,用于PowerPoint演示文稿的背景图片的压缩文件。这种类型的资源通常用于制作儿童教育、环保主题或者轻松愉快氛围的PPT,以增加视觉吸引力并...
最小树算法是图论中的一个经典问题,主要应用于网络优化,如通信网络设计、电力系统规划、运输问题等。在本案例中,我们有一个名为"mintreek.rar_最小树"的压缩包,其中包含了一个名为"mintreek.m"的MATLAB文件,这...
运筹学课程教学设计2-Tree and minimal tree of graph树与图的最小树-英文版.docx
寻找最小树(minimal tree)是图论中的一个重要问题,这通常指的是在保持所有顶点连接性的前提下,边的总权重尽可能小的生成树。这个问题在实际应用中非常常见,例如在构建通信网络、交通路线规划或者最小成本设计...
这个“小树长大”的项目是Scratch编程的一个实例,提供了一套完整的源代码,适合初学者学习和模仿。 在“小树长大.sb3”文件中,我们可以找到项目的实际代码。sb3文件是Scratch 3.0版本的项目文件格式,包含了所有...
它是关于最小树与最小树形图 方面的相关资料。。。
"少儿scratch编程项目源代码文件案例素材-小树长大.zip" 这个标题揭示了我们要探讨的主题是面向儿童的编程学习资源,具体来说是使用Scratch编程语言设计的一个项目案例。"小树长大"是该项目的名称,暗示这是一个关于...
**铅笔工具**:铅笔工具是画图程序中最基础也是最常用的工具之一。它允许用户以自由手绘的方式绘制线条或形状,适合用来勾勒图形的轮廓。在微软画图程序中,铅笔工具通常位于工具栏的显眼位置,其图标为一支铅笔。 ...
最小树问题通常指的是在图论中的最小生成树问题,目标是找到一个加权无向图的边子集,这些边连接了所有的顶点,并且使得子集的总权重最小。这个问题有多种解决方案,其中一种是Prim算法或Kruskal算法,但这里我们...
"淡雅粉色小树PPT背景图片.rar"这个压缩包文件提供了一种独特且具有美感的背景设计,特别适合那些希望为演示文稿增添个性化元素,尤其是面向女性受众或与浪漫、柔和主题相关的场合。 首先,我们来详细了解一下PPT...
最小树,又称最小生成树(Minimum Spanning Tree, MST),是一种用来连接图中所有节点,并使得连接边的总代价最低的树状结构。在多区域覆盖问题中,最小树能够帮助找到效率最高的子区域覆盖顺序。 接下来,应用基于...
根据给定的文件信息,我们可以总结出以下与C++图的深度优先遍历(Depth-First Search, DFS)、广度优先遍历(Breadth-First Search, BFS)以及最小生成树(Minimum Spanning Tree, MST)相关的知识点: ### C++中的...
本资源源自《啊哈算法》第七章节的精彩内容,专注于利用并查集(Disjoint Set Union, DSU)数据结构解决实际问题,具体展示了如何通过Java实现来高效搜索犯罪团队成员。哈磊老师以其生动的讲解风格,首先深入介绍了...
小班的孩子们通常对动植物有着天然的亲近感,以一棵小树的生长过程作为主线,不仅能够吸引孩子们的注意力,还能让他们在观察和排列图片的过程中,自然地建立起对时间序列的理解,锻炼他们观察细微差异的能力。...
【标题】"多彩小树PPT模板"是一个用于制作演示文稿的专业设计资源,它集成了多种颜色的小树图案,适用于各种与环保、生态、成长、教育等相关主题的演讲或报告。这款模板以其鲜明的色彩和生动的图像,能够吸引观众的...
"小树摆动"这个项目,显然就是利用canvas来实现一棵小树在屏幕上的动态摆动效果。 在canvas上绘制图形,首先要获取canvas元素的2D渲染上下文,这是通过调用`document.getElementById('canvas').getContext('2d')`来...
prim算法求最小生成树最小生成树的定义:最小生成树是一副连通加权无向图中一棵权值最小的生成树。来自维基百科的定义 假设给定无向图G一共有n个顶点,那么最小生成树一定会有 n-1 条边prim算法被用来求给定图的最小...