[BaekJoon]1260 DFSとBFS


1.  質問リンク


https://www.acmicpc.net/problem/1260

2.  質問する



サマリ


図が
  • の頂点および幹線を有する場合、BFSおよびDFSによってアクセスされる順序が出力される.複数のアクセス可能な頂点がある場合、最初にアクセスできる頂点番号が小さい頂点.
  • 入力
  • :1行目に頂点の個数N、幹線の個数M、ナビゲーションを開始する頂点の番号V、2行目からM行目に幹線が接続されている2つの頂点の番号を入力します.
  • 出力:1行目はDFSの結果を出力し、2行目はBFSの結果を出力する.
  • 説明:


    DFS(Depth-First Search)


    深度優先ナビゲーションYes
  • 本のノード(または任意のノード)から始まり、ブランチは次の四半期に入る前に全面的に検出され、移行される.
  • 、すなわち、まず定点の子供を探索する方法である.
  • この方法を使用して、
  • のすべてのノードにアクセスします.
  • 単純探索速度はBFSより遅いがBFSより単純である.

  • BFS(Breadth-First Search)


    幅優先ナビゲーションYes
  • ルートノード(または任意のノード)から、まず隣接ノードを参照する方法.
  • は、すべての幹線コストが同じ場合に最短距離を求める問題を効果的に解決した.
  • DFSに比べて、単純な検索速度が速く、複数のパスが幅を優先して検索できる場合でも、最短のパスであることが保証されます.

  • 3.  ソースコード

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.StringTokenizer;
    
    public class Main {
    	public ArrayList<Integer> DFS(int start, HashMap<Integer, ArrayList<Integer>> graph) {
    		ArrayList<Integer> visited = new ArrayList<Integer>();
    		ArrayList<Integer> needVisit = new ArrayList<Integer>();
    		needVisit.add(start);
    		while(needVisit.size() > 0) {
    			int node = needVisit.remove(0);
    			if(!visited.contains(node)) {
    				visited.add(node);
    				needVisit.addAll(0, graph.get(node));
    			}
    		}
    		
    		return visited;
    	}
    	
    	public ArrayList<Integer> BFS(int start, HashMap<Integer, ArrayList<Integer>> graph) {
    		ArrayList<Integer> visited = new ArrayList<Integer>();
    		ArrayList<Integer> needVisit = new ArrayList<Integer>();
    		needVisit.add(start);
    		while(needVisit.size() > 0) {
    			int node = needVisit.remove(0);
    			
    			if(!visited.contains(node)) {
    				visited.add(node);
    				needVisit.addAll(graph.get(node));
    			}
    		}
    		
    		return visited;
    	}
    	
    	public HashMap<Integer, ArrayList<Integer>> makeGraph(int vertex, ArrayList<String> edges) {
    		HashMap<Integer, ArrayList<Integer>> graph = new HashMap<Integer, ArrayList<Integer>>();
    		ArrayList<ArrayList<Integer>> each_edge = new ArrayList<ArrayList<Integer>>();
    		for(int i = 0; i < vertex; i++) {
    			each_edge.add(new ArrayList<Integer>());
    		}
    		for(int i = 0; i < edges.size(); i++) {
    			StringTokenizer st = new StringTokenizer(edges.get(i));
    			int vertex1 = Integer.parseInt(st.nextToken());
    			int vertex2 = Integer.parseInt(st.nextToken());
    			each_edge.get(vertex1 - 1).add(vertex2);
    			each_edge.get(vertex2 - 1).add(vertex1);
    		}
    		for(int i = 0; i < each_edge.size(); i++) {
    			Collections.sort(each_edge.get(i));
    			graph.put(i + 1, each_edge.get(i));
    		}
    		return graph;
    	}
    	
    	public static void main(String[] args) throws IOException {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    		String input = br.readLine();
    		StringTokenizer st = new StringTokenizer(input);
    		int vertex = Integer.parseInt(st.nextToken());
    		int edge = Integer.parseInt(st.nextToken());
    		int start = Integer.parseInt(st.nextToken());
    		ArrayList<String> edges = new ArrayList<String>();
    		for(int i = 0; i < edge; i++) {
    			edges.add(br.readLine());
    		}
    		br.close();
    		Main m = new Main();
    		HashMap<Integer, ArrayList<Integer>> graph = m.makeGraph(vertex, edges);
    		ArrayList<Integer> dfs = m.DFS(start, graph);
    		for(int i = 0; i < dfs.size(); i++) {
    			bw.write(dfs.get(i) + " ");
    		}
    		bw.write("\n");
    		ArrayList<Integer> bfs = m.BFS(start, graph);
    		for(int i = 0; i < bfs.size(); i++) {
    			bw.write(bfs.get(i) + " ");
    		}
    		bw.flush();
    		bw.close();
    	}
    }

    4.  に近づく

  • は、まず、幹線で接続された2つの頂点を与え、その後、それらを使用してグラフィックを作成する.
  • グラフィックを作成する場合は、HashMapを使用して各頂点に関連付けられた頂点を保存します.また、より低い頂点番号でアクセスする必要があるため、接続されている頂点を昇順に並べ替えることができます.
  • DFSを行う場合は、始点と図形を用いて解く.
  • DFSを実行すると、ArrayListが作成され、アクセスする頂点とアクセスする必要がある頂点が保存されます.
  • 開始ノードは最初にアクセスする必要があるので、最初にArrayListに配置してアクセスする頂点を保存します.
  • アクセスが必要な頂点のうち、先頭の頂点が最初にアクセスしなければならない頂点である場合、アクセスが必要な頂点でその頂点を削除し、その後、その頂点がアクセスした頂点を格納するArrayListにある場合、そのノードは既にアクセスしているノードであるため、他の操作は行われない.
  • が存在しない場合、削除されたノードはArrayListに配置され、そのノードに接続されたすべてのノードはArrayListの一番前に配置され、アクセスする必要があるすべてのノードが格納される.
  • ArrayListが
  • から3回目から4回目まで繰り返され、アクセスが必要な頂点が空のままである場合、ナビゲーションは終了します.
  • BFSを行う場合,始点と図形を用いて解く.
  • DFSと同様に、ArrayListを作成して、アクセスする頂点とアクセスする必要がある頂点を保存します.
  • 開始ノードは最初にアクセスする必要があるので、最初にArrayListに配置してアクセスする頂点を保存します.
  • アクセスが必要な頂点のうち、先頭の頂点が最初にアクセスしなければならない頂点である場合、アクセスが必要な頂点でその頂点を削除し、その後、その頂点がアクセスした頂点を格納するArrayListにある場合、そのノードは既にアクセスしているノードであるため、他の操作は行われない.
  • が存在しない場合、削除されたノードはArrayListに配置され、そのノードに接続されたすべてのノードはArrayListに配置され、アクセスする必要があるすべてのノードを保存する.
  • ArrayListが
  • から3回目から4回目まで繰り返され、アクセスが必要な頂点が空のままである場合、ナビゲーションは終了します.