티스토리 뷰

728x90
반응형
문제 링크

http://boj.kr/1260

 

1260번: DFS와 BFS

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사

www.acmicpc.net

문제 풀이

DFS와 BFS를 공부하기 위해서 꼭 한번 풀어볼 만한 기본적인 문제이다.

 

소스 코드
import java.util.LinkedList;
import java.util.Scanner;

class Graph{
	int V;
	public LinkedList<Integer> adj [] ; //
	public Graph(int v) {
		V = v;
		adj = new LinkedList [v+1];
		for (int i = 0; i < v+1; i++) {
			adj[i] = new LinkedList<>();
		}
	}

	void add(int v ,int w) {
		adj[v].add(w);
		adj[w].add(v);
	}

	void dfs(int v, boolean [] isVisited) {
		isVisited[v] = true;
		System.out.print(v+" ");

		for (int i = 0; i < adj[v].size(); i++) {
			int w = adj[v].get(i);
			if(!isVisited[w]) {
				dfs(w, isVisited);
			}
		}
	}

	void bfs(int v) {
		boolean[] isVisited = new boolean[V+1];

		LinkedList<Integer> que = new LinkedList<>();
		que.add(v);
		isVisited[v] = true;
		while(!que.isEmpty()) {
			int w = que.poll();
			System.out.print(w+" ");
			for (int i = 0; i < adj[w].size(); i++) {
				int x = adj[w].get(i);
				if(!isVisited[x]) {
					isVisited[x] = true;
					que.add(x);
				}
			}
		}
	}


}

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N= sc.nextInt();
		int M = sc.nextInt();
		int V = sc.nextInt();

		Graph gr = new Graph(N);

		for (int i = 0; i < M; i++) {
			gr.add(sc.nextInt(), sc.nextInt());
		}
		for (LinkedList list : gr.adj) {
			list.sort(null);
		}
		gr.dfs(V, new boolean[N+1]);
		System.out.println();
		gr.bfs(V);
	}
}
728x90
반응형
250x250
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함