하나의 정점으로부터 시작하여 차례대로 모든 정점들을 한 번씩 방문하는 것
문제유형 : 연결컴포넌트에 많이 사용됨
#include<bits/stdc++.h>
using namespace std;
int dy[4] = {-1, 0, 1, 0};
int dx[4] = {0, 1, 0, -1};
int m, n, k, y, x, ret, ny, nx, t;
int a[104][104];
bool visited[104][104];
void dfs(int y, int x){
cout << y << " : " << x << '\n';
visited[y][x] = 1;
for(int i = 0; i < 4; i++){
ny = y + dy[i];
nx = x + dx[i];
if(ny < 0 || nx < 0 || ny >=n || nx >= m) continue;
if(a[ny][nx] == 1 && !visited[ny][nx]){
dfs(ny, nx);
}
}
return;
}
int main(){
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> m;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
cin >> a[i][j];
}
}
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(a[i][j] == 1 && !visited[i][j]){
ret++; dfs(i, j);
}
}
}
cout << ret << '\n';
return 0;
}
문제유형 : 길찾기
#include<bits/stdc++.h>
using namespace std;
vector<int> adj[100];
int visited[100];
int nodeList[] = {10, 12, 14, 16, 18, 20, 22, 24};
void bfs(int here){
queue<int> q;
visited[here] = 1;
q.push(here);
while(q.size()){
int here = q.front(); q.pop();
for(int there : adj[here]){
if(visited[there]) continue;
visited[there] = visited[here] + 1;
q.push(there);
}
}
}
int main(){
adj[10].push_back(12);
adj[10].push_back(14);
adj[10].push_back(16);
adj[12].push_back(18);
adj[12].push_back(20);
adj[20].push_back(22);
adj[20].push_back(24);
bfs(10);
for(int i : nodeList){
cout << i << " : " << visited[i] << '\n';
}
cout << "10번으로부터 24번까지 최단거리는 : " << visited[24] - 1 << '\n';
return 0;
}