** 그래프

 - 정점들간의 관계를 표현하는 자료구조 ( G=(V,E) )

 - V는 Vertex(정점) 과 E는 Edge(간선) 을 의미하며 간선은 정점들 간의 연결관계를 표시합니다.

 - 간선 edge는 두 개의 정점이 있어야 정의가 됩니다 (cycle을 가지지 않을 경우)

 - directred graph(유향그래프) 와 undirected graph(무향 그래프) 가 있으며

 - 유향그래프에서는 vw와 wv는 다른 방향을 가지므로 다른 간선이다.

 - 가중치 그래프(weighted graph) 의 경우 (V,E,W)로 구성

 

 

 ** 그래프의 용어

 - 정점(Vertex) : 연결된 객체 (node)

 - 간선(Edge) : 정점들 간의 연결관계를 나타내는 선

 - incident : 정점과 간선의 관계에서 쓰는 용어 (정점에  간선이 연결된 경우)

 - adjacent : 정점과 정점간의 관계에서 쓰는 용어 (정점과 정점이 간선에의해 직접적으로 연결되어있는 경우)

 - 사이클(cycle) : 경로의 시작 정점과 끝 정점이 같을 경우

 - 차수(degree) : 정점에 연결되어 있는 간선의 수를 그 정점의 차수 라고 한다.

 

 

 ** 그래프의 구현

 - 보통 인접리스트로 구현을 하여, 인접 행렬으로도 구현 가능하다.

 - 인접행렬로 구현을 할 경우 두 정점이 직접 연결되어있는지 (adjacent) 를 O(1) 에 바로 알아낼 수 있다.

 - 그러나 어떤 특정 정점에 인접한 모든 정점들을 탐색하거나, 그래프의 간선의 수 등을 알아내려면

    O(n*n)이 걸린다 matrix를 모두 조사해야하므로....

 - 인접리스트로 구현할 경우 어떤 정점에 인접한 노드들은 바로 찾을 수 있다는 장점이 있다.

 

 

 ** 그래프의 탐색

 1. 깊이우선탐색(DFS, Depth-First-Search)

     - 정점을 탐색을 하는데 다음 연결된 정점을 탐색하기 전에 첫 정점과 연결된 정점을 우선 탐색

     - 모든 노드를 다 탐색하고자 할 경우 자주 사용한다.

     - 특정 정점에서 시작하여 원하는 다른 정점까지 경로가 있는지를 탐색할 때 사용하기도 한다.

 

 2. 너비우선탐색(BFS, Breadth-First-Search)

     - 탐색 시작 정점으로 부터 연결된 모든 정점을 먼저 탐색을 한 후 그 탐색한 정점과 연결된 다른 정점들을 탐색

     - 보통 최단경로를 찾는 문제에 BFS를 많이 사용한다.

     - 큐를 이용하여 구현을 많이 하는데 탐색정점과 연결된 정점들을 큐에 넣어서 탐색을 해가면서

     - 탐색한 정점은 큐에서 POP하고 그 정점에 연결된 새로운정점들을 큐에 PUSH해 준다.

     - 탐색을 시작할 때의 큐의 SIZE만큼 탐색을 하면 탐색 후에는 직접적으로 연결된 정점들은 모두 POP되었을 것이고

       탐색을 했던 정점들과 연결된 새로운 정점들이 큐에 들어와 있다.

'학부생 공부 > 자료구조' 카테고리의 다른 글

배열(Array) 와 연결리스트(Linked List) 비교  (0) 2020.12.15
트리 (Tree)  (0) 2020.10.14
벡터(Vector)  (0) 2020.02.15
큐(queue)  (0) 2020.02.14
스택 (Stack)  (0) 2020.02.13

몇개의 조건이 달린 dfs 이용 문제입니다.

 

while문 안에서 물의 높이를 1씩 증가 시켜가면서 

 

dfs를 돌려 침수영역을 구하고 기존의 최대 침수 지역을 넘는 수 라면 그 수를 최대침수지역에 넣습니다.

 

모든 지역이 모두 침수 되었을 경우 break문을 걸어 while문 을 빠져 나오고 

 

출력을 하였습니다.

 

(코로나 때문에 학사일정이 너무 정신없어서 간만에 문제를 풀었더니 깔끔하지가 않은 느낌이네요...)

 

'알고리즘 문제풀이 > DFS와 BFS' 카테고리의 다른 글

백준 17471 [C++]  (0) 2020.10.19
백준 18352 [C++]  (0) 2020.10.17
백준 2583  (0) 2020.03.02
백준 14502  (0) 2020.02.17
백준 11724  (0) 2020.02.13

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

 

2583번: 영역 구하기

첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다. 둘째 줄부터 K개의 줄에는 한 줄에 하나씩 직사각형의 왼쪽 아래 꼭짓점의 x, y좌표값과 오른쪽 위 꼭짓점의 x, y좌표값이 빈칸을 사이에 두고 차례로 주어진다. 모눈종이의 왼쪽 아래 꼭짓점의 좌표는 (0,0)이고, 오른쪽 위 꼭짓점의 좌표는(N,M)이다. 입력되는 K개의 직사각형들이 모눈종이 전체를 채우는 경우는 없다.

www.acmicpc.net

- 기본적인 dfs 문제입니다. 

 

- 문제를 읽으면 dfs구나 알 수 있고 처음 접해서 풀기 좋은 문제인 것 같습니다.

 

- 좌표 기준 때문에 i,j만 조금 신경써서 해주시면 됩니다(문제에 맞추어서)

 

- 전 항상 몇번 풀어도 좌표 기준 신경 쓰는게 그렇게 짜증나더라는...ㅎ;;;

<필기>

 

<코드>

'알고리즘 문제풀이 > DFS와 BFS' 카테고리의 다른 글

백준 18352 [C++]  (0) 2020.10.17
백준 2486 : 안전영역  (0) 2020.03.22
백준 14502  (0) 2020.02.17
백준 11724  (0) 2020.02.13
백준 2178  (0) 2020.01.14

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

 

11724번: 연결 요소의 개수

첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주어진다.

www.acmicpc.net

연결 요소를 구하는 문제 입니다..

 

연결요소의 정확한 정의가 나와있지 않아 감은 대충 왔으나 검색을 한번 해보고 문제를 풀었습니다.

 

문제를 분석 하고는 dfs로 푸는 것이 편하겠다 싶어 dfs로 풀었습니다.

 

정점 index 순서대로 dfs를 도는데 이미 방문한 정점이면 dfs를 돌지 않습니다.

 

그리고 저는 처음에 아무것도 연결되지 않은 정점은 연결요소로 count를 하지 않는 다고 생각했으나

 

그럴 경우도 연결요소로 count를 하셔야 합니다 (즉 , 입력(6, 0) ---정점만 6개 일경우 결과값은 6입니다.)

 

은근 저와같은 생각을 하신분들이 있으시리라 생각합니다.....

 

그 외에는 쉬운 문제입니다.

 

<풀이>

<코드>

 

'알고리즘 문제풀이 > DFS와 BFS' 카테고리의 다른 글

백준 2583  (0) 2020.03.02
백준 14502  (0) 2020.02.17
백준 2178  (0) 2020.01.14
백준 1260  (0) 2020.01.14
백준 2667  (0) 2020.01.14

+ Recent posts