`
eriol
  • 浏览: 407873 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

寻找树形图中的最长路径

阅读更多

题目:

在一个迷宫中找距离最长的两个点。

 

迷宫可以看作是一个无根树,因此,这个问题等价与在一个树形图中找最远的两个节点,也叫做这个图的直径。

迷宫、树形图有个很好的特点:即任意两个节点之间的距离就是这两点之间的最短路径和最长路径,也可以说任意两个节点之间的距离一定的。

 

其算法为

 

任选一点u为起点,对树进行BFS遍历,找出离u最远的点v。然后以v为起点,再进行BFS遍历,找出离v最远的点w。则v到w的路径长度即为树的直径。时间复杂度为O(n)。

 

原理:设起点为u,第一次BFS找到的终点v一定是树的直径的一个端点。

证明:

  1. 如果u 是直径上的点,则v必然是直径的终点。(因为如果v不是的话,则必定存在另一个点w使得u到w的距离更长,则于BFS找到了v矛盾)
  2. 如果u不是直径上的点,则u到v的路径必然与树的直径相交,设交点为c,那么c到v的路径与直径的后半段重合。所以v一定是直径的一个端点,因此从v进行BFS得到的一定是直径长度。

 

import java.util.LinkedList;
import java.util.Queue;

public class PeopleNet {
	
	private int[] dist = new int[10];
	private int[] last = new int[10];
	
	public People farest(People src) {
		
		for (int i = 0; i < 10; i++) {
			dist[i] = Integer.MAX_VALUE;
			last[i] = -1;
		}
		
		Queue<People> queue = new LinkedList<People>();
		queue.offer(src);
		dist[src.id] = 0;
		
		People temp = null;
		while (!queue.isEmpty()) {
			temp = queue.poll();
			for (People p : temp.friends) {
				if (dist[p.id] == Integer.MAX_VALUE) {
					dist[p.id] = dist[temp.id] + 1;
					last[p.id] = temp.id;
					queue.offer(p);
				}
			}
		}

		return temp;
	}
	
	public void find(People src, People dest) {
		farest(src);
		showPath(dest.id);
	}
	
	public void showPath(int i) {
		if (last[i] == -1) {
			System.out.print(i + " ");
			return;
		}
		
		showPath(last[i]);
		System.out.print(i + " ");
	}
	
	public void getFarest(People p) {
		People v = farest(p);
		People w = farest(v);
	
                System.out.println("the longest path is from " + v.id + " to " + w.id);	
		showPath(w.id);
	}
}

class People {
	int id;
	LinkedList<People> friends;
	
	public People(int id) {
		this.id = id;
		friends = new LinkedList<People>();
	}
}
 

 

原文地址:http://hi.baidu.com/051156/blog/item/6f8c69eed5dfa03e2cf534d5.html

 

分享到:
评论

相关推荐

    第2章 树形动态规划(2021.07.23).pdf

    另一个常见的应用场景是寻找一棵边带权的树中的最长路径问题,即树中两点间距离最远的路径。这个问题可以通过分别计算每个节点为根的子树中的最长链来解决。每个节点需要记录两个值,即从自身到最远叶子节点的最大...

    图路径问题及及生成树ppt,入门专用

    5. 最长路径问题:与最短路径相反,它寻找图中两个节点间边权之和最大的路径,这通常在有向图中更复杂。 这些内容涵盖了图算法的基础和一些高级应用,对于ACM竞赛的初学者来说,深入学习这些概念和算法是必要的,...

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

    1. **最小生成树**:最小生成树是无向连通图的一种特殊树形结构,它由图中的边构成,使得树中所有边的权值之和最小。最小生成树的构建对于资源优化分配和网络建设有着实际意义。例如,在建设通信网络时,我们需要在...

    zuiduanlujing.rar_最大路径问题_路径

    此外,对于特定类型的图,如树形结构或完全图,可能存在更高效的方法。例如,在树上,可以采用分治策略或自底向上的递归方法来找到最大路径。 “图的最短路径问题.cpp”文件很可能是实现这些算法之一的C++代码,...

    动态规划类型分析(区间,线性,树形,路径)

    树形动态规划常用于树或图的最优结构搜索,如树的直径、最近公共祖先等。这类问题需要对树的结构有深入理解,并能设计出从叶节点到根节点的递归或自底向上的状态转移过程。 通过学习和掌握这些动态规划的类型和应用...

    实验九 图和二叉检索树1

    最小生成树是指在一个加权无向图中,连接所有顶点的树形结构,其边的权重之和最小。Prim算法和Kruskal算法是两种常用的求解最小生成树的方法。Prim算法从一个顶点开始,逐步添加边,每次都选择与当前生成树连接且...

    第3次作业(图结构)1

    最小生成树(MST)是图理论中的一个重要概念,它是一个边的子集,构成了一个树形结构,连接了图中的所有顶点,且总权重最小。Prim算法是一种常见的求解MST的方法,它从一个顶点开始,逐步添加边,保持生成树的性质,...

    数据结构与算法图的二部分

    生成树是无向图的一个子集,这个子集形成了一个树形结构,包含图中的所有顶点,且任意两个顶点之间仅有一条路径。生成树确保了图的连通性,但不包含环路。 二、最小生成树 最小生成树是在保证连接所有顶点的前提下...

    代码库图书参考.pdf

    4. **有向图最小树形图** 和 **Minimal Steiner Tree** - 这些问题涉及到在网络优化中寻找连接特定节点集的最小树形结构,Steiner Tree问题是一个经典的组合优化问题。 5. **TARJAN强连通分量** - Tarjan算法用于...

    数据结构图PPT学习教案.pptx

    最后,最小支撑树是寻找一个图的所有边中成本最低的树形子集,它连接了图中的所有顶点,而形成的树结构没有环。克鲁斯卡尔算法和普里姆算法常用于求解最小支撑树问题,对于构建高效的网络和运输系统有重要意义。 综...

    数据结构实验报告二叉树、图的操作及其应欢迎下载

    在图中,关键路径是从起点到终点的最长路径,可以使用拓扑排序和回溯等算法来寻找。实验中,需要掌握如何在图中找到关键路径。 最后,最短路径问题是在图中寻找两个节点间的最短路径,常见的算法有Dijkstra算法和...

    java_CaminoMasCorto.zip_Java编程_Java_

    4. **动态规划**:对于某些特定类型的图,如树形结构,可以使用动态规划来求解最长路径问题。这通常涉及维护一个数组,存储到每个节点的最长路径。 5. **回溯**:在复杂情况下,回溯法可以帮助找到所有可能的路径,...

    ACM模板代码

    - **有向图最小树形图**:与最小生成树类似,但在有向图中构建树形结构,通常用于网络设计问题。 - **MINIMAL STEINER TREE**:在给定点集上找到连接所有点的最小树,常用于网络设计和图像处理。 3. **强连通分量...

    ACM算法模板选doc

    13. **BFS最长路径**:使用广度优先搜索寻找树或图中最长路径。 14. **树状数组**:一种数据结构,用于高效地进行区间修改和查询操作。 15. **背包问题**:在有限容量下求解最大价值的物品组合。 16. **凸包问题*...

    图论与图学习

    3. 图的性质:度(degree)是节点的邻接边数,最小生成树(Minimum Spanning Tree, MST)是图中边权重之和最小的树形子图。常用的MST算法有Prim's和Kruskal's算法。 4. 最短路径问题:Dijkstra算法和Floyd-Warshall...

    离散数学(2)-2021春-习题汇总-rfhits1

    - **最小生成树**是树形图的边集合,连接所有顶点并具有最小总权重。 - **Prim算法**和**Kruskal算法**都是用于找到最小生成树的方法。 **平面图与着色** - **平面图**是可以二维平展而不导致边交叉的图。 - **K3*...

    二叉树、图的操作及其应用.pdf

    实验中提到的关键路径和最短路径算法是图论中的重要概念,关键路径用于找出项目管理中的最长路径,确定任务的最早完成时间,而最短路径算法如Dijkstra算法则用于找出图中两点间的最短路径。 实验环境是Windows XP...

    离散数学图论树PPT学习教案.pptx

    树的高度是树中从根节点到最远叶子节点的最长路径的长度。根节点的深度为0,其下一层的节点深度为1,以此类推。具有相同深度的节点位于同一层。有序树是特殊的根树,其中每个节点的儿子按照特定顺序排列,如果每个...

    天津大学 ACM模板

    - 最短路径和最长路径问题:求解点、线段、圆等几何形状之间的最短和最长路径。 - 圆和多边形的交点问题:计算圆和各种几何形状的交点和交集区域。 - 重心计算:求解三角形、多边形、凸包等的重心。 - 面积和体积...

    数据结构实验 图的遍历

    同时,你可能还会接触到树形结构,因为树是图的一个特例,其任何两个节点间有且仅有一条路径,因此DFS和BFS在树上的应用也非常重要。 在实际编程中,理解DFS和BFS的原理和实现细节是非常必要的,这将有助于解决更...

Global site tag (gtag.js) - Google Analytics