[ํ๋ก๊ทธ๋๋จธ์ค] ๋คํธ์ํฌ (๊น์ด/๋๋น ์ฐ์ ํ์(DFS/BFS), C++)
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
void BFS(int start, vector<int> *graph, bool *visited){
queue<int> q;
visited[start] = true;
q.push(start);
printf("%d visited.\n", start);
while(!q.empty()){
int current = q.front();
q.pop();
for(int next: graph[current]){
if(visited[next] == false){
visited[next] = true;
q.push(next);
printf("%d visited.\n", next);
}
}
}
}
int solution(int n, vector<vector<int>> computers){
vector<int> graph[n];
bool visited[n];
int cnt=0;
fill(visited, visited+n, false);
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
if(computers[i][j] == 1){
graph[i].push_back(j);
}
}
}
for(int i=0; i<n; i++){
if(visited[i] == false) {
BFS(i, graph, visited);
cnt++; printf("%d\n", cnt);
}
}
return cnt;
}
int main(){
int n; // n: # of computers
scanf("%d", &n);
vector<vector<int>> computers;
for(int i=0; i<n; i++){
vector<int> v;
for(int j=0; j<n; j++){
int num; scanf("%d", &num);
v.push_back(num);
}
computers.push_back(v);
}
printf("%d\n", solution(n, computers));
}
computers์์ computers[i][j] == 1์ธ ๊ฒฝ์ฐ์๋ง vector์์ graph[i]์ j๋ฅผ ๋ฃ์ด์คฌ๋ค.
๊ทธ๋ผ ๋ค์๊ณผ ๊ฐ์ด ์ฐ๊ฒฐ์ฑ์ ๋ํ๋ผ ์ ์๋ค.
BFS๋ก ํ์์ ์งํํด์ ์ฐ๊ฒฐ์ฑ์ด ์๋ ๊ฒฝ์ฐ BFS ํจ์ ๋ด์์ start ์ ์ ์ ๋ํด ์ฐ๊ฒฐ๋ ๋ชจ๋ ์ ์ ์ ๋ํด ๋ฐฉ๋ฌธ์ ํ๊ณ ํ๊ฐ ๋น๋ฉด ํ์์ ๋๋ด๊ณ ๋ฆฌํดํ๋ค. ์ด๊ฒ์ ํ๋์ ์ฐ๊ฒฐ์ฑ์ผ๋ก ๊ฐ์ฃผํ๊ณ main์ผ๋ก ๋ฆฌํด ํ ์นด์ดํ ์ ์ฆ๊ฐ์ํค๋ฉด ๋๋ค.
์์ ๊ฐ์ด ํ๋ฒ ์ฐ๊ฒฐ๋ ์ ์ ๋ค ๋ฐฉ๋ฌธ์ ๋๋ด๋ฉด cnt๋ฅผ ์ฆ๊ฐํ๊ณ ์ถ๋ ฅํ๋ ๊ณผ์ ์ผ๋ก ์ ๋๋ก ๋ฐฉ๋ฌธํ๋์ง ํ์ธํด๋ดค๋ค.
void DFS(int start, vector<int> *graph, bool *visited){
visited[start] = true;
for(int next: graph[start]){
if(!visited[next]) DFS(next, graph, visited);
}
}
DFS์ ๊ฒฝ์ฐ, ์ฌ๊ท ํธ์ถ๋ก ๊ตฌํํด๋ดค๊ณ , BFS ํจ์๋ฅผ DFS ํจ์๋ก ๋ฐ๊ฟ์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
#include <string>
#include <vector>
#include <queue>
using namespace std;
void BFS(int start, vector<int> *graph, bool *visited){
queue<int> q;
visited[start] = true;
q.push(start);
while(!q.empty()){
int current = q.front();
q.pop();
for(int next: graph[current]){
if(visited[next] == false){
visited[next] = true;
q.push(next);
}
}
}
}
int solution(int n, vector<vector<int>> computers){
vector<int> graph[n];
bool visited[n];
int cnt=0;
fill(visited, visited+n, false);
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
if(computers[i][j] == 1){
graph[i].push_back(j);
}
}
}
for(int i=0; i<n; i++){
if(visited[i] == false) {
BFS(i, graph, visited);
cnt++; printf("%d\n", cnt);
}
}
return cnt;
}
#include <string>
#include <vector>
#include <queue>
using namespace std;
void DFS(int start, vector<int> *graph, bool *visited){
visited[start] = true;
for(int next: graph[start]){
if(!visited[next]) DFS(next, graph, visited);
}
}
int solution(int n, vector<vector<int>> computers){
vector<int> graph[n];
bool visited[n];
int cnt=0;
fill(visited, visited+n, false);
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
if(computers[i][j] == 1){
graph[i].push_back(j);
}
}
}
for(int i=0; i<n; i++){
if(visited[i] == false) {
//BFS(i, graph, visited);
DFS(i, graph, visited);
cnt++; printf("%d\n", cnt);
}
}
return cnt;
}
[๋ฐฑ์ค(BOJ)] 15552๋ฒ: ๋น ๋ฅธ A+B (C++) (0) | 2021.03.10 |
---|---|
[๋ฐฑ์ค(BOJ)] 2751๋ฒ: ์ ์ ๋ ฌํ๊ธฐ 2 (์ ๋ ฌ, C++) (0) | 2021.03.10 |
[๋ฐฑ์ค(BOJ)] 1303๋ฒ: ์ ์ - ์ ํฌ (DFS/BFS, C++) (0) | 2021.03.02 |
[๋ฐฑ์ค(BOJ)] 4963๋ฒ: ์ฌ์ ๊ฐ์ (DFS/BFS, C++) (0) | 2021.03.02 |
[๋ฐฑ์ค(BOJ)] 2667๋ฒ: ๋จ์ง๋ฒํธ๋ถ์ด๊ธฐ (DFS/BFS, C++) (0) | 2021.02.27 |