[DFS BFS]−1260 DFSおよびBFS
3565 ワード
リンクテキスト
隣接行列と隣接リストを用いる方法では,隣接リストを用いて解いた.
隣接マトリクス隣接リストの違い
隣接マトリクスは非常に容易に実施できる.ノードの接続関係を理解するには、adj[i][j]が0であるか1であるかを判断するだけで、O(1)を持つことができます.(無方向上では0,0|1,1|2...|n.nの間で対角線対称を呈する.)ただし、あるノードから接続されているすべてのノードにアクセスする場合は、水平行(adj[2])を最後に迂回する必要があるため、各ノードの合計数をチェックする必要があるため、O(Vertax)と同じ時間がかかります.これは、頂点が増えるにつれて、2 D配列のサイズが大きくなることを意味し、複数のノードでチェックする必要があるという致命的な問題が発生します.これらのノード数制限のより効果的な隣接リスト.1億個のノードがあり、幹線が10本もない場合、2 D隣接マトリクスを使用するとメモリの効率が低下します.しかし、隣接リストの利点と欠点は、その幹線の数に依存することである.つまり、これは幹線の数に比例してメモリを消費する.幹線の数に依存するため、時間的複雑さはO(Edge)に相当する.iノードj図が接続されているかどうかを決定しようとすると、隣接マトリクスはadj[i][j]を直接介して検査することができる(O(1)).「隣接」リストでは、i番目のリストに接続されているノードの数でループするのが欠点です.
隣接行列と隣接リストを用いる方法では,隣接リストを用いて解いた.
隣接マトリクス隣接リストの違い
隣接マトリクスは非常に容易に実施できる.ノードの接続関係を理解するには、adj[i][j]が0であるか1であるかを判断するだけで、O(1)を持つことができます.(無方向上では0,0|1,1|2...|n.nの間で対角線対称を呈する.)ただし、あるノードから接続されているすべてのノードにアクセスする場合は、水平行(adj[2])を最後に迂回する必要があるため、各ノードの合計数をチェックする必要があるため、O(Vertax)と同じ時間がかかります.これは、頂点が増えるにつれて、2 D配列のサイズが大きくなることを意味し、複数のノードでチェックする必要があるという致命的な問題が発生します.これらのノード数制限のより効果的な隣接リスト.1億個のノードがあり、幹線が10本もない場合、2 D隣接マトリクスを使用するとメモリの効率が低下します.しかし、隣接リストの利点と欠点は、その幹線の数に依存することである.つまり、これは幹線の数に比例してメモリを消費する.幹線の数に依存するため、時間的複雑さはO(Edge)に相当する.iノードj図が接続されているかどうかを決定しようとすると、隣接マトリクスはadj[i][j]を直接介して検査することができる(O(1)).「隣接」リストでは、i番目のリストに接続されているノードの数でループするのが欠点です.
package oneDay_twoSol.DB_FirstSearch;
import java.util.*;
public class DFS_BFS {
static ArrayList<ArrayList<Integer>> adjacentList = new ArrayList<>(); // 인접리스트
static boolean visited[]; // 방문 여부 판단.
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int start_Vertax = sc.nextInt();
sc.nextLine();
for (int i = 0; i <= n; i++) {
adjacentList.add(new ArrayList<Integer>());
}
for (int i = 1; i <= m; i++) {
int a=sc.nextInt();
int b=sc.nextInt();
// 방향이 없는 그래프 특징.
adjacentList.get(a).add(b);
adjacentList.get(b).add(a);
}
for (int i = 1; i <=n; i++) {
if(!adjacentList.get(i).isEmpty())
Collections.sort(adjacentList.get(i));
}
/* for (int i = 0; i <adjacentList.size() ; i++) {
System.out.println(adjacentList.get(i));
}*/
visited=new boolean[n+1];
dfs(start_Vertax);
visited=new boolean[n+1];
System.out.println();
bfs(start_Vertax);
}
static void dfs(int vertax) {
System.out.print(vertax + " ");
visited[vertax] = true;
// ===== 방문함과 동시에 출력 =====
for (int i = 0; i <adjacentList.get(vertax).size() ; i++) {
//adjacentList.get(vertax) -> 해당 방문하는 노드의 인접리스트이 사이즈 만큼만 순회 (해당 정점과 연결되있는 노드만 탐색한다는 의미
int temp=adjacentList.get(vertax).get(i);
if (!visited[temp])
{ dfs(temp); // 재귀적으로 함수 호출을 하는 DFS의 특징
}
}
}
// 재귀적으로 호출하는 성질인 DFS와는 다르게 큐의 삽입된 정점들을 차례대로 상대하는 특징을 가지므로 재귀적인 DFS와는 다른 특징.
static void bfs(int vertax)
{
Queue<Integer> q=new LinkedList<>();
q.offer(vertax);
visited[vertax]=true;
while (!q.isEmpty())
{
int temp=q.poll();
System.out.print(temp+" ");
for (int i = 0; i <adjacentList.get(temp).size() ; i++) {
int v=adjacentList.get(temp).get(i);
if(!visited[v])
{
q.offer(v);
visited[v]=true;
}
}
}
}
}
Reference
この問題について([DFS BFS]−1260 DFSおよびBFS), 我々は、より多くの情報をここで見つけました https://velog.io/@admin1194/DFSBFS-1260DFS와-BFSテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol