新农上路
- 积分
- 99
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2018-8-17
- 最后登录
- 1970-1-1
|
打了个注释, 供君参考
- static class Node{
- int key;
- Set<Node> to;
- Set<Node> from;
- public Node(){
- to = new HashSet<>();
- from = new HashSet<>();
- }
- }
-
- public int minReverse(Node source, Node end){
- Set<Node> visited = new HashSet<>();
-
- Deque<Node> que = new ArrayDeque<>();
-
- // init the que with nodes that can achieve with 0 reverse
- if(DFS(que, source, visited, end)) return 0;
-
- int time = 1;
- while(!que.isEmpty()){
- int size = que.size();
- // for all the node in next layer
- for(int i = 0; i < size; i++){
- Node temp = que.poll();
- // only reverse one edge
- for(Node node : temp.from){
- // if find the end node, return the current the layer
- if(DFS(que, node, visited, end)) return time;
- }
- }
- // use one more reverse edges
- time++;
- }
- return -1;
- }
-
- private boolean DFS(Deque<Node> que, Node node, Set<Node> visited, Node end){
- // find end
- if(node == end) return true;
- // already visited
- if(visited.contains(node)) return false;
-
- // add to next layer
- que.offer(node);
-
- // make it visited
- visited.add(node);
-
- // visited all the node it can achieve without reverse an edge
- for(Node next : node.to){
- if(DFS(que, next, visited, end)) return true;
- }
-
- // not find end
- return false;
- }
复制代码 |
|