본문 바로가기
알고리즘/백준 문제풀이

[백준 JAVA & Python] 1260 DFS와 BFS

by 새싹감자 2022. 9. 12.

문제


1260번: DFS와 BFS (acmicpc.net)

 

1260번: DFS와 BFS

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

www.acmicpc.net

 

bfs, dfs를 연습해보기 좋은 기본문제이다.

 

풀이방법


  • 무방향 그래프이기 때문에, 배열 양쪽에 값을 넣어주는 것이 포인트이다.
    • list[to].add(from);
      list[from].add(to);
  • dfs는 순열을 사용해서, bfs는 큐를 사용해서 구현하였다.

코드

 


 

  • java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {

	static ArrayList<Integer> list[];
	static int N,M;
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer sb = new StringTokenizer(br.readLine());
		
		N = Integer.parseInt(sb.nextToken());
		M = Integer.parseInt(sb.nextToken());
		int V = Integer.parseInt(sb.nextToken());
		
		list = new ArrayList[N+1];
		for(int i=1; i<N+1; i++) {
			list[i]=new ArrayList<Integer>();
		}
		for(int i=0; i<M; i++) {
			sb = new StringTokenizer(br.readLine());
			int from = Integer.parseInt(sb.nextToken());
			int to = Integer.parseInt(sb.nextToken());
			list[to].add(from);
			list[from].add(to);
		}
		
		for(int i=1; i<=N; i++) {
			Collections.sort(list[i]);
		}
		
		boolean[] visit=new boolean[N+1];
		dfs(V,visit);
		System.out.println();
		visit=new boolean[N+1];
		bfs(V,visit);
		
		
	}
	
	static void dfs(int start, boolean[] visit) {
		System.out.print(start+" ");
		visit[start]=true;
		
		for(int i=0; i<list[start].size(); i++) {
			if(visit[list[start].get(i)]==false) {
				dfs(list[start].get(i),visit);
				}
			}
		
		return;
	}
	
	static void bfs(int start,boolean[] visit) {
		Queue<Integer> queue = new LinkedList<>();
		queue.offer(start);
		visit[start]=true;
		
		while(!queue.isEmpty()) {
			int c=queue.poll();
			System.out.print(c+" ");
			for(int i=0; i<list[c].size(); i++) {
				if(visit[list[c].get(i)]==false) {
					visit[list[c].get(i)]=true;
					queue.offer(list[c].get(i));
				}
			}

		}
		
	}


}
  • Python
from collections import deque

n,m,v=map(int,input().split())
visit=[False]*(n+1)
graph=[[] for _ in range(n+1)]
for _ in range(m):
    a,b=map(int,input().split())
    graph[a].append(b)
    graph[b].append(a)

for i in range(n+1):
    graph[i].sort()

def dfs(start):
    visit[start]=True
    print(start,end=' ')
    for i in graph[start]:
        if visit[i]==False:
            dfs(i)

def bfs(start):
    visit[start]=True
    que = deque()
    que.append(start)
    while(que):
        n = que.popleft()
        print(n,end=' ')
        for i in graph[n]:
            if visit[i]==False:
                que.append(i)
                visit[i]=True
dfs(v)
visit=[False]*(n+1)
print('')
bfs(v)

'알고리즘 > 백준 문제풀이' 카테고리의 다른 글

[백준 JAVA]2636 치즈  (0) 2022.09.15
[백준 JAVA]13023 ABCDE  (0) 2022.09.12
[백준Java]2589 보물섬  (0) 2022.09.12
[백준 JAVA]2206 벽 부수고 이동하기  (0) 2022.09.12
[백준 JAVA] 6603 로또  (0) 2022.09.06

댓글