新农上路
- 积分
- 94
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2016-2-11
- 最后登录
- 1970-1-1
|
这题我感觉就先把入度为0的点全去掉就可以了,然后剩下的就是入度为0的点,剩下几个全返回,代码很简单,如果不对请指正:
- import java.util.*;
- public class MinNodesToTraverseGraph {
- private void DFS(Set<Integer> visited, int index, List<Integer> ret, Map<Integer, Set<Integer>> hash) {
- visited.add(index);
- for(int val: hash.getOrDefault(index, new HashSet<>())) {
- if(ret.contains(val)) ret.remove(val);
- if(!visited.contains(val)) {
- DFS(visited, val, ret, hash);
- }
- }
- }
- public List<Integer> findMin(int[][] edges, int n) {
- Map<Integer, Set<Integer>> hash = new HashMap<>();
- for(int[] edge: edges) {
- if(edge[0] == edge[1]) continue;
- hash.computeIfAbsent(edge[0], k -> new HashSet<>()).add(edge[1]);
- }
- Set<Integer> visited = new HashSet<>();
- List<Integer> ret = new ArrayList<>();
- for(int i = 0; i <= n; i++) {
- if(visited.contains(i)) continue;
- ret.add(i);
- DFS(visited, i, ret, hash);
- }
- return ret;
- }
- public static void main(String[] args) {
- MinNodesToTraverseGraph traverseGraph = new MinNodesToTraverseGraph();
- int[][] edges = new int[][] {{2, 9}, {3, 3}, {3, 5}, {3, 7}, {4, 8}, {5, 8},
- {6, 6}, {7, 4}, {8, 7}, {9, 3}, {9, 6}};
- List<Integer> ret = traverseGraph.findMin(edges, 9);
- for(int val: ret) {
- System.out.print(val + " ");
- }
- System.out.println();
- edges = new int[][] {{1, 2}, {2, 3}, {3, 4}, {1, 5}};
- ret = traverseGraph.findMin(edges, 5);
- for(int val: ret) {
- System.out.print(val + " ");
- }
- }
- }
复制代码
补充内容 (2019-3-18 15:41):
入度不为0的点去掉,剩下不为0的就是答案,这里发代码格式太乱了 |
|