如果一个图中所有点都是联通的,求最小树可以将图遍历完成,这里的最小是指边最少,跟边长没有关系。
算法利用深度优先遍历,记载每个遍历过的节点,将节点按照遍历顺序记录下来就是所谓的最小树。
关于深度优先遍历请参见深度优先遍历。
不过这里奇怪的是:
假如所有节点之间是双向联通的,只用生成一个数组,装入所有的节点,例如{'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]);
}
}
}
分享到:
相关推荐
运筹学试讲2-Tree and minimal tree of graph树与图的最小树-英文版.pptx
运筹学课程教学设计2-Tree and minimal tree of graph树与图的最小树-英文版.docx
这是一张小树卡通PPT背景图片。 关键词:卡通幻灯片背景图片,三棵小树PowerPoint背景图片,.jpg格式;
它是关于最小树与最小树形图 方面的相关资料。。。
图的Steiner最小树问题是经典的组合优化问题,是一个NP难题,在不同的领域有着广泛的应用。研究该问题的部分数学性质,在此基础上给出了该问题的初步降阶方法和下界子方法,形成一个新的回溯算法。该算法具有较低的...
基于代价地图和最小树的移动机器人多区域覆盖方法
没啥好说的 本来只想免费分享出去很早以前的课程设计 资源分最低最低只能选2,我就把二叉树 哈夫曼树 和 最小树放到一起了 作为参考啊
C++图的深度遍历及广度遍历的代码 及最小生成树的操作
这是一组风格淡雅唯美的PPT背景图片,采用心形树叶的粉色小树为背景主元素设计,比较适合女生使用。
这是一张小树卡通PPT背景图片。 关键词:卡通幻灯片背景图片,三棵小树PowerPoint背景图片,.jpg格式;
淡雅可爱心形小树PPT背景图片,5页ppt格式。关键词:爱心树 卡通 童话 儿童 梦幻。
这是一张小树卡通PPT背景图片。 关键词:卡通幻灯片背景图片,三棵小树PowerPoint背景图片,.jpg格式;
卡通小树背景的PPT模板下载,关键词:咖色,褐色PPT背景色,卡通小树PPT背景图片,卡通幻灯片模板下载;
粉色背景可爱小树幻灯片背景图片,png格式,1024768分辨率。
幻灯片模板封面,使用了一张小树图案作为背景图片,清新简洁。 PowerPoint模板内容页面,使用了绿色与土黄色搭配,设计了24张幻灯片图表。 本模板适合用于制作个人工作总结PPT等。.PPTX格式;
VC++小树浏览器(完整源程序+可执行文件).rar VC++小树浏览器(完整源程序+可执行文件).rar
<br> 这是四张反冲效果的小树PPT背景图片,.jpg格式;
小树设计图片html网站模板下载
幻灯片模板封面,使用手绘风格,绘制了七颗彩色卡通小树作为PPT背景图片。左侧填写教学设计PPT标题。界面设计清新卡通。 PowerPoint模板内容页,由22张彩色手绘细线图表制作。 本模板适合用于制作儿童美术教育培训...
这是四张反冲效果的小树PPT背景图片,.jpg格式;