[leetcode] 题型整理之图论
图论的常见题目有两类,一类是求两点间最短距离,另一类是拓扑排序,两种写起来都很烦。
求最短路径:
127. Word Ladder
Given two words (beginWord and endWord), and a dictionary's word list, find the length of shortest transformation sequence from beginWord to endWord, such that:
- Only one letter can be changed at a time
- Each intermediate word must exist in the word list
For example,
Given:
beginWord = "hit"
endWord = "cog"
wordList = ["hot","dot","dog","lot","log"]
As one shortest transformation is "hit" -> "hot" -> "dot" -> "dog" -> "cog",
return its length 5.
Note:
- Return 0 if there is no such transformation sequence.
- All words have the same length.
All words contain only lowercase alphabetic characters.
从起点开始向外更新,因为每条路径的权值都不是负数,所以先更新的总比后更新的小。
已经被更新过的之后就不用考虑了
133. Clone Graph
Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors.
Nodes are labeled uniquely.
We use # as a separator for each node, and , as a separator for node label and each neighbor of the node.
As an example, consider the serialized graph {0,1,2#1,2#2,2}.
The graph has a total of three nodes, and therefore contains three parts as separated by #.
- First node is labeled as
0. Connect node0to both nodes1and2. - Second node is labeled as
1. Connect node1to node2. - Third node is labeled as
2. Connect node2to node2(itself), thus forming a self-cycle.
Visually, the graph looks like the following:
1
/ \
/ \
0 --- 2
/ \
\_/
Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nodes), write a function to check whether these edges make up a valid tree.
For example:
Given n = 5 and edges = [[0, 1], [0, 2], [0, 3], [1, 4]], return true.
Given n = 5 and edges = [[0, 1], [1, 2], [2, 3], [1, 3], [1, 4]], return false.
Hint:
- Given
n = 5andedges = [[0, 1], [1, 2], [3, 4]], what should your return? Is this case a valid tree? - According to the definition of tree on Wikipedia: “a tree is an undirected graph in which any two vertices are connected by exactly one path. In other words, any connected graph without simple cycles is a tree.”
Note: you can assume that no duplicate edges will appear in edges. Since all edges are undirected, [0, 1] is the same as [1, 0] and thus will not appear together in edges.
public class Solution {
public boolean validTree(int n, int[][] edges) {
List<HashSet<Integer>> sets = new ArrayList<HashSet<Integer>>();
for (int i = 0; i < n; i++) {
sets.add(new HashSet<Integer>());
}
boolean[] isVisited = new boolean[n];
Arrays.fill(isVisited, false);
for (int[] edge : edges) {
int v1 = edge[0];
int v2 = edge[1];
sets.get(v1).add(v2);
sets.get(v2).add(v1);
}
boolean result = dfs(sets, isVisited, 0, -1);
if (!result) {
return false;
}
for (int i = 0; i < n; i++) {
if (!isVisited[i]) {
return false;
}
}
return true;
}
private boolean dfs(List<HashSet<Integer>> sets, boolean[] isVisited, int now, int prev) {
boolean isV = isVisited[now];
if (isV) {
return false;
}
isVisited[now] = true;
for (Integer x : sets.get(now)) {
if (x != prev && !dfs(sets, isVisited, x, now)) {
return false;
}
}
return true;
}
}
310. Minimum Height Trees
For a undirected graph with tree characteristics, we can choose any node as the root. The result graph is then a rooted tree. Among all possible rooted trees, those with minimum height are called minimum height trees (MHTs). Given such a graph, write a function to find all the MHTs and return a list of their root labels.
Format
The graph contains n nodes which are labeled from 0 to n - 1. You will be given the number n and a list of undirected edges (each edge is a pair of labels).
You can assume that no duplicate edges will appear in edges. Since all edges are undirected, [0, 1] is the same as [1, 0] and thus will not appear together in edges.
Example 1:
Given n = 4, edges = [[1, 0], [1, 2], [1, 3]]
0
|
1
/ \
2 3
return [1]
Example 2:
Given n = 6, edges = [[0, 3], [1, 3], [2, 3], [4, 3], [5, 4]]
0 1 2
\ | /
3
|
4
|
5
return [3, 4]
Hint:
- How many MHTs can a graph have at most?
Note:
(1) According to the definition of tree on Wikipedia: “a tree is an undirected graph in which any two vertices are connected by exactly one path. In other words, any connected graph without simple cycles is a tree.”
(2) The height of a rooted tree is the number of edges on the longest downward path between the root and a leaf.
Credits:
Special thanks to @dietpepsi for adding this problem and creating all test cases.
public class Solution {
public List<Integer> findMinHeightTrees(int n, int[][] edges) {
List<List<Integer>> graph = new ArrayList<List<Integer>>(n);
if (n < 3 || edges.length == 0) {
List<Integer> result = new ArrayList<Integer>();
if (n == 0) {
return result;
} else {
for (int i = 0; i < n; i++) {
result.add(i);
}
return result;
}
}
for (int i = 0; i < n; i++) {
List<Integer> list = new LinkedList<Integer>();
graph.add(list);
}
for (int[] edge : edges) {
int v1 = edge[0];
int v2 = edge[1];
graph.get(v1).add(v2);
graph.get(v2).add(v1);
}
int count = n;
List<Integer> toRemove = new ArrayList<Integer>();
for (int i = 0; i < n; i++) {
List<Integer> list = graph.get(i);
if (list.size() == 1) {
toRemove.add(i);
}
}
while (!toRemove.isEmpty() && count > 1) {
List<Integer> tmpRemove = new ArrayList<Integer>();
for (Integer leave : toRemove) {
List<Integer> list0 = graph.get(leave);
int parent = list0.get(0);
list0.clear();
List<Integer> list = graph.get(parent);
list.remove(leave);
if (list.size() == 1) {
tmpRemove.add(parent);
}
}
count -= toRemove.size();
toRemove = tmpRemove;
if (count <= 2) {
break;
}
}
List<Integer> result = new ArrayList<Integer>();
result.addAll(toRemove);
return result;
}
}
[leetcode] 题型整理之图论的更多相关文章
- [leetcode] 题型整理之二叉树
94. Binary Tree Inorder Traversal Given a binary tree, return the inorder traversal of its nodes' va ...
- [leetcode] 题型整理之动态规划
动态规划属于技巧性比较强的题目,如果看到过原题的话,对解题很有帮助 55. Jump Game Given an array of non-negative integers, you are ini ...
- [leetcode] 题型整理之排列组合
一般用dfs来做 最简单的一种: 17. Letter Combinations of a Phone Number Given a digit string, return all possible ...
- [leetcode] 题型整理之数字加减乘除乘方开根号组合数计算取余
需要注意overflow,特别是Integer.MIN_VALUE这个数字. 需要掌握二分法. 不用除法的除法,分而治之的乘方 2. Add Two Numbers You are given two ...
- [leetcode] 题型整理之cycle
找到环的起点. 一快一慢相遇初,从头再走再相逢.
- [leetcode]题型整理之用bit统计个数
137. Single Number II Given an array of integers, every element appears three times except for one. ...
- [leetcode] 题型整理之查找
1. 普通的二分法查找查找等于target的数字 2. 还可以查找小于target的数字中最小的数字和大于target的数字中最大的数字 由于新的查找结果总是比旧的查找结果更接近于target,因此只 ...
- [leetcode] 题型整理之排序
75. Sort Colors Given an array with n objects colored red, white or blue, sort them so that objects ...
- [leetcode] 题型整理之字符串处理
71. Simplify Path Given an absolute path for a file (Unix-style), simplify it. For example,path = &q ...
随机推荐
- jsp中超链接路径的写法
主题 超链接不就是一个地址字符串吗?这能有什么花头? LZSB! 曾经我也是这么想的.... 最近对apache的学习让我对网页中超链接,CSS,js的路径的写法有了一些新的认识. 所以这篇文章主要分 ...
- 拖动对象ondrag
说明: 在进行拖放操作时,dataTransfer 对象用来保存被拖动的数据.它可以保存一项或多项数据.一种或者多种数据类型.dataTransfer对象有两个主要的方法:getData()方法和se ...
- 谈谈混合 App Web 资源的打包与增量更新
综述 移动 App 的运行环境具有带宽不稳定,流量收费,启动速度比较重要等特点,所以混合 App 如何加载 Web 资源并不是一个新问题.本文目的是总结出一种资源打包下载的思路和方案,并且提供一种打包 ...
- HTML 内容居中方式总结
在HTML网页排版经常会用到关于对其方式的情况,水平居中和垂直居中.特别是水平居中,并不是一个简单的text-align就可以解决所有的情况. 开始之前普及一点HTML知识,目标很明显,不同的页面结构 ...
- mybatis问题is not known to the MapperRegistry
is not known to the MapperRegistry mapper.xml里面对应的dao应该是interface而非class
- angularjs $scope.$apply 方法详解
myApp.controller('firstController',function($scope,$interval){ $scope.date = new Date(); setInterval ...
- MVC开发模式下的用户角色权限控制
前提: MVC开发模式 大概思想: 1.在MVC开发模式下,每个功能都对应着不同的控制器或操作方法名(如修改密码功能可能对应着User/changepd),把每个功能对应的控制器名和操作方法名存到数据 ...
- 解决Unsupported major.minor version 51.0错误
解决Unsupported major.minor version 51.0错误使用jdk6运行项目时发生了Unsupported major.minor version 51.0错误.经过网上搜索发 ...
- ssh配置git clone简易流程
1. 生成密钥 ssh-keygen -t rsa -C "jaynaruto@qq.com" //如果只有一对密钥,建议不要修改默认的密钥名称,即一直按回车即可 此命令会在你当前 ...
- 从SQL的视角用powershell
SQL是数据处理中的利器,语法简单,表现力强.同时SQL作为说明型语言,让使用者关注在数据处理上.Powershell是微软提供的一个命令行工具.虽然在powershell中无法直接编写SQL,但是提 ...