스택은 Last in First Out이라는 성격을 띈 자료구조라서 가장 최근에 탐색한 노드의 자식을 탐색해야하는 DFS에 적절한 자료구조이다.
큐는 First in First Out이라는 성격을 띄고 있으므로 가장 최근에 탐색한 노드들이 먼저 pop되기 때문에 넓게 자신의 자식들을 먼저 탐색하는 BFS에 적절한 자료구조이다.
다양한 그래프 알고리즘
- 정점들 사이 최단거리 → 최단 경로 알고리즘 (다익스트라, 플로이드-와샬, 벨만 포드 등)
- 사이클이 없는 그래프 → 트리
- 가중치의 합이 작은 트리를 만들어야 할 때 → 최소 비용 신장 트리
- 선후 관계가 주어진 그래프 → 위상정렬
- 정점 사이의 관계를 집합으로 나눌 때 → 유니온 파인드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int R, C;
vector<vector<char>> board;
vector<char> alphabet;
vector <vector<bool>> visited;
int dx[4] = { 0, 0, -1, 1 };
int dy[4] = { -1, 1, 0, 0 };
int answer = 1;
void dfs(int x, int y, int cnt) {
for (int i = 0; i < 4; i++) {
int nextX = x + dx[i];
int nextY = y + dy[i];
// 다음 보드로 이동할 수 있는지
if (nextX >= 0 && nextX < R && nextY >= 0 && nextY < C) {
//이미 방문한 알파벳인지
auto isfound = find(alphabet.begin(), alphabet.end(), board[nextX][nextY]);
if (!visited[nextX][nextY] && isfound == alphabet.end()) {
visited[nextX][nextY] = true;
alphabet.push_back(board[nextX][nextY]);
dfs(nextX, nextY, cnt+1);
visited[nextX][nextY] = false;
alphabet.pop_back();
}
}
}
if (cnt > answer) answer = cnt;
}
int main() {
cin >> R >> C;
board.resize(R, vector<char>(C));
visited.assign(R, vector<bool>(C, false));
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
cin >> board[i][j];
}
}
visited[0][0] = true;
alphabet.push_back(board[0][0]);
dfs(0, 0, 1);
cout << answer;
}
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
vector<int> bfs(vector<vector<int>>& v, vector<int>& rumor, int N, int M) {
vector<int> answer(N+1, -1);
vector<int> rest(N + 1, 0);
queue<int> q;
//최초 유포자
for (int i = 0; i < M; i++) {
answer[rumor[i]] = 0;
q.push(rumor[i]);
}
//i번째 사람의 주위 사람들의 절반 수
for (int i = 1; i <= N; i++) {
rest[i] = (v[i].size() + 1) / 2;
}
while (!q.empty()) {
int cur = q.front();
int t = answer[cur];
q.pop();
for (int i = 0; i < v[cur].size(); i++) {
int next = v[cur][i];
//이미 루머를 믿고 있는 경우
if (answer[next] > -1) continue;
//next는 루머를 믿고있는 cur의 지인이므로 믿어야 하는 사람 한명 감소
rest[next]--;
//주변 절반 이상이 믿고 있다면 큐에 넣음
if (!rest[next]) {
answer[next] = t + 1;
q.push(next);
}
}
}
return answer;
}
int main() {
int N, M;
cin >> N;
vector<vector<int>>v(N + 1);
for (int i = 1; i <= N; i++) {
while (true) {
int rel;
cin >> rel;
if (rel == 0) break;
v[i].push_back(rel);
}
}
cin >> M;
//rumor은 믿은 시간을 담는 배열
vector<int> rumor(M, 0);
for (int i = 0; i < M; i++) {
cin >> rumor[i];
}
vector<int> answer = bfs(v, rumor, N, M);
for (int i = 1; i <= N; i++) {
cout << answer[i] << " ";
}
}