`
eriol
  • 浏览: 400580 次
  • 性别: 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

 

分享到:
评论

相关推荐

    LeetCode解题总结

    1.3 寻找两个排序数组的中位数 1.4 最长连续序列 1.5 累加和 1.6 移除数组中指定值 1.7 下一个排列 1.8 第n个全排列 1.9 验证数独的正确性 1.10 容纳雨水的量 1.11 旋转图像 1.12 数字加1 1.13 爬楼梯 1.14 格雷码 ...

    ACM 算法经典代码 数据结构经典代码

    8. 最小树形图(邻接阵形式) 24 四.图论_网络流 25 1. 上下界最大流(邻接表形式) 25 2. 上下界最大流(邻接阵形式) 26 3. 上下界最小流(邻接表形式) 27 4. 上下界最小流(邻接阵形式) 29 5. 最大流(邻接表形式) 30 6. ...

    算法引论:一种创造性方法.[美]Udi Manber(带详细书签).pdf

    10.2.4 在无向图中寻找三角形 10.3 有关线性规划的归约 10.3.1 概述与定义 10.3.2 归约到线性规划的例子 10.4 下界的归约 10.4.1 寻找简单多边形算法复杂度的下界 10.4.2 关于矩阵的简单归约 10.5 常见的...

    算法导论(part1)

    书中给出了230多幅图,说明各个算法的工作过程。我们强调将算法的效率作为一种设计标准,对书中的所有算法,都给出了关于其运行时间的详细分析。 本书主要供本科生和研究生的算法或数据结构课程使用。因为书中讨论...

    算法导论中文版

     24.2 有向无环图中的单源最短路径问题  24.3 Dijkstra算法  24.4 差分约束和最短路径  24.5 最短路径性质的证明  思考题  本章注记 第25章 所有结点对的最短路径问题  25.1 最短路径和矩阵乘法  25.2...

    算法导论(part2)

    书中给出了230多幅图,说明各个算法的工作过程。我们强调将算法的效率作为一种设计标准,对书中的所有算法,都给出了关于其运行时间的详细分析。 本书主要供本科生和研究生的算法或数据结构课程使用。因为书中讨论...

    数据结构(C++)有关练习题

    4、用邻接矩阵或邻接图实现一个有向图的存储,并实现单源最短路径算法的实现(这个类的一个成员函数),并能输出该图的关键路径。 注:1、要用面向对象的方法设计代码; 2、一个图是一个类的实例; 3、类...

    leetcode中国-LeetCode:由Python和Go实现的LeetCode练习

    归并排序:#4寻找中位数 快速排序 快速排序 基数排序 基数排序 查找 二分查找 搜索旋转数组中的最小值I 搜索旋转数组中的最小值II 搜索旋转数组I 搜索旋转数组II 数组 双指针 颜色分类(荷兰国旗问题) 四数之和 移除...

    浙江大学ACM模板 计算几何,图论,数据结构,经典题的模板

    10.9 最长公共单调子序列 202 10.10 最长子序列 204 10.11 最大子串匹配 204 10.12 最大子段和 205 10.13 最大子阵和 206 11.其它 207 11.1 大数(只能处理正数) 207 11.2 分数 212 11.3 矩阵 214 11.4 线性方程组 ...

Global site tag (gtag.js) - Google Analytics