<Algorithm> 64. 11400번 단절선
by BFine반응형
1. 11400번 단절선
DFS Spanning Tree 문제, 단절점과 같이 풀어야 정확한 이해가 가능 할 듯 하다.
단절점과의 차이점은 온길을 제외하는 것과 자신을 비교대상에서 빼는 것 이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.StringTokenizer; public class Main { static int count = 1; static int[] discovered; static ArrayList<Pair> ans = new ArrayList<Pair>(); public static void main(String[] args) throws NumberFormatException, IOException { BufferedReader br =new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); int N = Integer.parseInt(st.nextToken())+1; int M = Integer.parseInt(st.nextToken()); ArrayList<Node>[] aLists = new ArrayList[N]; discovered = new int[N]; for(int i = 0; i < N; i ++) { aLists[i] = new ArrayList<>(); } for(int i = 0; i < M; i ++) { st = new StringTokenizer(br.readLine()); int a = Integer.parseInt(st.nextToken()); int b = Integer.parseInt(st.nextToken()); aLists[a].add(new Node(b)); aLists[b].add(new Node(a)); } for(int i = 1; i < N; i++) if(discovered[i] == 0) { dfs(i, 0, aLists); } Collections.sort(ans,new Comparator<Pair>() { @Override public int compare(Pair o1, Pair o2) { if(o1.x == o2.x) return o1.y-o2.y; // 같을 경우 처리 반드시 return o1.x - o2.x; } }); System.out.println(ans.size()); for(Pair par : ans) { System.out.println(par.x+" "+par.y); } } public static int dfs(int vertax, int parent,ArrayList<Node>[] aLists) { discovered[vertax] = count++; int ret = discovered[vertax]; /*온 길을 제외하고 다른 길로 방문정점보다 앞 순서에 방문한 정점으로 갈 수 있으면 단절선이 아님 */ for(Node node : aLists[vertax]) { if(node.adjVertax == parent) continue; if(discovered[node.adjVertax] == 0) { int low = dfs(node.adjVertax, vertax, aLists); if(low > discovered[vertax]) { ans.add(new Pair(Math.min(vertax, node.adjVertax),Math.max(vertax, node.adjVertax))); } ret = Math.min(ret, low); }else { ret = Math.min(ret, discovered[node.adjVertax]); } } return ret; } } class Node{ int adjVertax; public Node(int adjVertax) { super(); this.adjVertax = adjVertax; } } class Pair{ int x,y; public Pair(int x, int y) { super(); this.x = x; this.y = y; } } | cs |
출처 : http://bowbowbow.tistory.com/3, http://jason9319.tistory.com/119
반응형
'공부(2018~2019) - 스킨변경전 > Algorithm' 카테고리의 다른 글
<Algorithm> 66. 11727번 2*n 타일링 2 (0) | 2018.08.27 |
---|---|
<Algorithm> 65. 14675번 단절점과 단절선 (0) | 2018.08.25 |
<Algorithm> 63. 11266번 단절점 (0) | 2018.08.24 |
<Algorithm> 62. 11403번 경로찾기 (0) | 2018.08.22 |
<Algorithm> 61. 2357번 최대값과 최소값(Segment Tree) (0) | 2018.08.22 |
블로그의 정보
57개월 BackEnd
BFine