题目:
在一个迷宫中找距离最长的两个点。
迷宫可以看作是一个无根树,因此,这个问题等价与在一个树形图中找最远的两个节点,也叫做这个图的直径。
迷宫、树形图有个很好的特点:即任意两个节点之间的距离就是这两点之间的最短路径和最长路径,也可以说任意两个节点之间的距离一定的。
其算法为:
任选一点u为起点,对树进行BFS遍历,找出离u最远的点v。然后以v为起点,再进行BFS遍历,找出离v最远的点w。则v到w的路径长度即为树的直径。时间复杂度为O(n)。
原理:设起点为u,第一次BFS找到的终点v一定是树的直径的一个端点。
证明:
- 如果u 是直径上的点,则v必然是直径的终点。(因为如果v不是的话,则必定存在另一个点w使得u到w的距离更长,则于BFS找到了v矛盾)
- 如果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
分享到:
相关推荐
另一个常见的应用场景是寻找一棵边带权的树中的最长路径问题,即树中两点间距离最远的路径。这个问题可以通过分别计算每个节点为根的子树中的最长链来解决。每个节点需要记录两个值,即从自身到最远叶子节点的最大...
5. 最长路径问题:与最短路径相反,它寻找图中两个节点间边权之和最大的路径,这通常在有向图中更复杂。 这些内容涵盖了图算法的基础和一些高级应用,对于ACM竞赛的初学者来说,深入学习这些概念和算法是必要的,...
1. **最小生成树**:最小生成树是无向连通图的一种特殊树形结构,它由图中的边构成,使得树中所有边的权值之和最小。最小生成树的构建对于资源优化分配和网络建设有着实际意义。例如,在建设通信网络时,我们需要在...
此外,对于特定类型的图,如树形结构或完全图,可能存在更高效的方法。例如,在树上,可以采用分治策略或自底向上的递归方法来找到最大路径。 “图的最短路径问题.cpp”文件很可能是实现这些算法之一的C++代码,...
树形动态规划常用于树或图的最优结构搜索,如树的直径、最近公共祖先等。这类问题需要对树的结构有深入理解,并能设计出从叶节点到根节点的递归或自底向上的状态转移过程。 通过学习和掌握这些动态规划的类型和应用...
最小生成树是指在一个加权无向图中,连接所有顶点的树形结构,其边的权重之和最小。Prim算法和Kruskal算法是两种常用的求解最小生成树的方法。Prim算法从一个顶点开始,逐步添加边,每次都选择与当前生成树连接且...
最小生成树(MST)是图理论中的一个重要概念,它是一个边的子集,构成了一个树形结构,连接了图中的所有顶点,且总权重最小。Prim算法是一种常见的求解MST的方法,它从一个顶点开始,逐步添加边,保持生成树的性质,...
生成树是无向图的一个子集,这个子集形成了一个树形结构,包含图中的所有顶点,且任意两个顶点之间仅有一条路径。生成树确保了图的连通性,但不包含环路。 二、最小生成树 最小生成树是在保证连接所有顶点的前提下...
4. **有向图最小树形图** 和 **Minimal Steiner Tree** - 这些问题涉及到在网络优化中寻找连接特定节点集的最小树形结构,Steiner Tree问题是一个经典的组合优化问题。 5. **TARJAN强连通分量** - Tarjan算法用于...
最后,最小支撑树是寻找一个图的所有边中成本最低的树形子集,它连接了图中的所有顶点,而形成的树结构没有环。克鲁斯卡尔算法和普里姆算法常用于求解最小支撑树问题,对于构建高效的网络和运输系统有重要意义。 综...
在图中,关键路径是从起点到终点的最长路径,可以使用拓扑排序和回溯等算法来寻找。实验中,需要掌握如何在图中找到关键路径。 最后,最短路径问题是在图中寻找两个节点间的最短路径,常见的算法有Dijkstra算法和...
4. **动态规划**:对于某些特定类型的图,如树形结构,可以使用动态规划来求解最长路径问题。这通常涉及维护一个数组,存储到每个节点的最长路径。 5. **回溯**:在复杂情况下,回溯法可以帮助找到所有可能的路径,...
13. **BFS最长路径**:使用广度优先搜索寻找树或图中最长路径。 14. **树状数组**:一种数据结构,用于高效地进行区间修改和查询操作。 15. **背包问题**:在有限容量下求解最大价值的物品组合。 16. **凸包问题*...
3. 图的性质:度(degree)是节点的邻接边数,最小生成树(Minimum Spanning Tree, MST)是图中边权重之和最小的树形子图。常用的MST算法有Prim's和Kruskal's算法。 4. 最短路径问题:Dijkstra算法和Floyd-Warshall...
- **最小生成树**是树形图的边集合,连接所有顶点并具有最小总权重。 - **Prim算法**和**Kruskal算法**都是用于找到最小生成树的方法。 **平面图与着色** - **平面图**是可以二维平展而不导致边交叉的图。 - **K3*...
实验中提到的关键路径和最短路径算法是图论中的重要概念,关键路径用于找出项目管理中的最长路径,确定任务的最早完成时间,而最短路径算法如Dijkstra算法则用于找出图中两点间的最短路径。 实验环境是Windows XP...
树的高度是树中从根节点到最远叶子节点的最长路径的长度。根节点的深度为0,其下一层的节点深度为1,以此类推。具有相同深度的节点位于同一层。有序树是特殊的根树,其中每个节点的儿子按照特定顺序排列,如果每个...
- 最短路径和最长路径问题:求解点、线段、圆等几何形状之间的最短和最长路径。 - 圆和多边形的交点问题:计算圆和各种几何形状的交点和交集区域。 - 重心计算:求解三角形、多边形、凸包等的重心。 - 面积和体积...
同时,你可能还会接触到树形结构,因为树是图的一个特例,其任何两个节点间有且仅有一条路径,因此DFS和BFS在树上的应用也非常重要。 在实际编程中,理解DFS和BFS的原理和实现细节是非常必要的,这将有助于解决更...