leetcode 684. Redundant Connection 邻接表的环的判断 + 深度优先遍历DFS
来源:互联网 发布:淘宝店铺活动方图案例 编辑:程序博客网 时间:2024/05/17 08:44
In this problem, a tree is an undirected graph that is connected and has no cycles.
The given input is a graph that started as a tree with N nodes (with distinct values 1, 2, …, N), with one additional edge added. The added edge has two different vertices chosen from 1 to N, and was not an edge that already existed.
The resulting graph is given as a 2D-array of edges. Each element of edges is a pair [u, v] with u < v, that represents an undirected edge connecting nodes u and v.
Return an edge that can be removed so that the resulting graph is a tree of N nodes. If there are multiple answers, return the answer that occurs last in the given 2D-array. The answer edge [u, v] should be in the same format, with u < v.
Example 1:
Input: [[1,2], [1,3], [2,3]]
Output: [2,3]
Explanation: The given undirected graph will be like this:
1
/ \
2 - 3
Example 2:
Input: [[1,2], [2,3], [3,4], [1,4], [1,5]]
Output: [1,4]
Explanation: The given undirected graph will be like this:
5 - 1 - 2
| |
4 - 3
Note:
The size of the input 2D-array will be between 3 and 1000.
Every integer represented in the 2D-array will be between 1 and N, where N is the size of the input array.
Update (2017-09-26):
We have overhauled the problem description + test cases and specified clearly the graph is an undirected graph. For the directed graph follow up please see Redundant Connection II). We apologize for any inconvenience caused.
本题题意很简单,就是寻找组成环的第一条变,那么做法就是每加入一条边,就进行环检测,一旦发现了环,就返回当前边。对于无向图,我们还是用邻接表来保存,建立每个结点和其所有邻接点的映射,由于两个结点之间不算有环,所以我们要避免这种情况 1->{2}, 2->{1}的死循环,所以我们用一个变量pre记录上一次递归的结点,比如上一次遍历的是结点1,那么在遍历结点2的邻接表时,就不会再次进入结点1了,这样有效的避免了死循环,使其能返回正确的结果,
代码如下:
#include <iostream>#include <vector>#include <map>#include <set>#include <queue>#include <stack>#include <string>#include <climits>#include <algorithm>#include <sstream>#include <functional>#include <bitset>#include <numeric>#include <cmath>#include <regex>using namespace std;class Solution {public: map<int, set<int>> graph; vector<int> findRedundantConnection(vector<vector<int>>& edges) { for (auto edge : edges) { if (hasCycle(edge[0], edge[1], -1) == true) return edge; else { graph[edge[0]].insert(edge[1]); graph[edge[1]].insert(edge[0]); } } return{}; } bool hasCycle(int cur, int target, int pre) { if (graph[cur].find(target) != graph[cur].end()) return true; else { for (int a : graph[cur]) { if (a == pre) continue; if (hasCycle(a, target, cur) == true) return true; } return false; } }};
- leetcode 684. Redundant Connection 邻接表的环的判断 + 深度优先遍历DFS
- 图的邻接表 邻接矩阵 深度优先遍历DFS
- 无向图邻接表的深度优先遍历(DFS)
- 邻接表实现--图的深度优先遍历DFS和广度优先遍历BFS
- 邻接表的深度优先搜索(DFS)
- 基于邻接表的深度优先遍历
- 邻接表的深度优先遍历以及广度优先遍历
- 图的深度优先遍历DFS(分别以邻接矩阵和邻接表实现)
- 邻接表-图的遍历-广度和深度优先遍历
- leetcode 110. Balanced Binary Tree(平衡二叉树的判断) DFS深度优先遍历
- leetcode 392. Is Subsequence 子序列判断 深度优先遍历DFS + 一个很简单的循环
- 基于邻接表实现的DFS深度优先搜索
- 图的邻接表存储下的深度优先遍历
- 邻接图的广度优先遍历和深度优先遍历
- 图的邻接表存储与深度优先遍历算法
- 图的深度优先遍历--邻接表实现
- 图的深度优先遍历(邻接表存储)
- 图的邻接表存储及深度优先遍历程序
- Java内存区域与内存溢出异常
- H分量旋转法
- 自动化运维工具puppet一:puppet资源及单机模型
- qdu 15信安 vjudge
- Asp.NET Core+ABP框架+IdentityServer4+MySQL+Ext JS之添加实体
- leetcode 684. Redundant Connection 邻接表的环的判断 + 深度优先遍历DFS
- android 中遥控器键值的添加和修改
- 数据结构实验之排序五:归并求逆序数
- POJ 1088 滑雪
- jquery_ajax请求@RequestBody的controller时出现400或者415的错误_SpringBoot
- python chr()、unichr()和ord()
- 数字古籍图书馆
- 【raspberrypi】大神自制树莓派墨水屏
- Hyperopt中文文档导读