-
1260 DFS와 BFS/11724 연결요소의 개수Algorithm/baekjoon 2022. 2. 20. 18:55
(1)DFS와 BFS
https://www.acmicpc.net/problem/1260
1260번: DFS와 BFS
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사
www.acmicpc.net
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<string> #include<vector> #include<algorithm> #include<queue> using namespace std; vector<int> graph[1001]; vector<bool> visited(1001, false); void DFS(int ver) { cout << ver<<" "; visited[ver] = true; for (int i = 0; i < graph[ver].size(); i++) { int next = graph[ver][i]; if (visited[next]) continue; DFS(next); } } void BFS(int start, int v) { queue<int> q; q.push(start); visited[start] = true; cout << start << " "; while (!q.empty()) { int qSize = q.size(); for (int i = 0; i < qSize; i++) { int ver = q.front(); q.pop(); for (int i = 0; i < graph[ver].size(); i++) { int adjv = graph[ver][i]; if (!visited[adjv]) { q.push(adjv); visited[adjv] = true; cout << adjv << " "; } } } } } int main() { cin.tie(NULL); cin.sync_with_stdio(false); cout.tie(NULL); int v, e, startv; cin >> v >> e >> startv; for (int i = 0; i < e; i++) { int v1, v2; cin >> v1 >> v2; graph[v1].push_back(v2); graph[v2].push_back(v1); } for (int i = 1; i <= v; i++) { //정점이 작은 것부터 방문하도록 sort(graph[i].begin(), graph[i].end()); } DFS(startv); cout << "\n"; for (int i = 1; i <= v; i++) { visited[i] = false; } BFS(startv, v); return 0; }
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<string> #include<vector> #include<algorithm> #include<queue> using namespace std; vector<int> graph[1001]; vector<bool> visited(1001, false); void DFS(int ver) { cout << ver << " "; visited[ver] = true; for (int i = 0; i < graph[ver].size(); i++) { int next = graph[ver][i]; if (visited[next]) continue; DFS(next); } } void BFS(int start, int v) { queue<int> q; q.push(start); visited[start] = true; while (!q.empty()) { int ver = q.front(); q.pop(); cout << ver << " "; for (int i = 0; i < graph[ver].size(); i++) { int adjv = graph[ver][i]; if (!visited[adjv]) { q.push(adjv); visited[adjv] = true; } } } } int main() { cin.tie(NULL); cin.sync_with_stdio(false); cout.tie(NULL); int v, e, startv; cin >> v >> e >> startv; for (int i = 0; i < e; i++) { int v1, v2; cin >> v1 >> v2; graph[v1].push_back(v2); graph[v2].push_back(v1); } for (int i = 1; i <= v; i++) { //정점이 작은 것부터 방문하도록 sort(graph[i].begin(), graph[i].end()); } DFS(startv); cout << "\n"; for (int i = 1; i <= v; i++) { visited[i] = false; } BFS(startv, v); return 0; }
참고 사이트
1. DFS 개념
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=ndb796&logNo=221230945092
16. 깊이 우선 탐색(DFS)
깊이 우선 탐색(Depth First Search)은 탐색을 함에 있어서 보다 깊은 것을 우선적으로 하여 탐색하는 ...
blog.naver.com
2. c++ /graph를 벡터로
유사 코드
https://hyunah-home.tistory.com/6
백준/ 1260번(DFS와 BFS)/ C++ ; Vector와 sort함수 사용
DFS와 BFS를 구현하는 연습을 해볼 수 있는 기본 문제. 주의해야 할 점 1. 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문. 2. 입력으로 주어지는 간선은 양방향. 3. 간
hyunah-home.tistory.com
(2) 11724 연결 요소의 개수
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
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<string> #include<vector> #include<algorithm> #include<queue> using namespace std; vector<int> graph[1001]; vector<bool> visited(1001, false); int cnt = 0; void BFS(int start, int v) { queue<int> q; q.push(start); visited[start] = true; while (!q.empty()) { int ver = q.front(); q.pop(); //cout << ver << " "; cnt++; for (int i = 0; i < graph[ver].size(); i++) { int adjv = graph[ver][i]; if (!visited[adjv]) { q.push(adjv); visited[adjv] = true; } } } } int main() { cin.tie(NULL); cin.sync_with_stdio(false); cout.tie(NULL); int v, e; cin >> v >> e ; int connectedN = 0; for (int i = 0; i < e; i++) { int v1, v2; cin >> v1 >> v2; graph[v1].push_back(v2); graph[v2].push_back(v1); } for (int i = 1; i <= v; i++) { //정점이 작은 것부터 방문하도록 sort(graph[i].begin(), graph[i].end()); } for (int s = 1; s <= v; s++) { if (!visited[s]) { BFS(s,v); connectedN++; } } cout << connectedN; return 0; }
'Algorithm > baekjoon' 카테고리의 다른 글
(dp)1463 1로 만들기/9095 1,2,3 더하기 (0) 2022.02.22 (bfs/dfs)4963 섬의 개수 (0) 2022.02.22 (재귀)1629 곱셈/1074 Z (0) 2022.02.19 1978 소수 찾기/2609 최대공약수와 최소공배수 (0) 2022.02.19 1181 단어 정렬/11650 좌표 정렬하기/11651 좌표 정렬하기2/2750 수 정렬하기/10989 수 정렬하기3/10814 나이순 정렬 (0) 2022.02.18