오랜만에 풀어본 DFS 알고리즘 문제이다.
지금까지는 재귀로 풀었지만 BFS에서 queue컨테이너를 사용하듯이 stack컨테이너를 사용해 풀어보았다.
또한 정보 저장을 map 연습을 위해 map을 사용해 보았다.
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <stack>
#include <map>
using namespace std;
void input_info(map<char, vector<char>> &N, vector<pair<char, char>> &M)
{
int n, m;
int i;
string temp;
cin >> n;
cin.ignore();//버퍼에 남아있는 개행문자 제거
for (i = 0; i < n; i++)
{
getline(cin, temp);
N[temp.front()].push_back(temp.back());
}
cin >> m;
cin.ignore();//버퍼에 남아있는 개행문자 제거
for (i = 0; i < m; i++)
{
getline(cin, temp);
M.push_back({ temp.front(), temp.back() });
}
/*
for (auto j : N)
{
cout << j.first << " : ";
for (i = 0; i < j.second.size(); i++)
{
cout << j.second[i] << " ";
}
cout << "\n";
}
for (auto j : M)
{
cout << j.first << " " << j.second << "\n";
}
*/
return;
}
bool DFS(char start, char end, map<char, vector<char>>& N)
{
//cout << "DFS()\n";
//스택을 사용해 보겠다.
vector<bool> visited(26, false);
stack <char> st;
char current, next;
int i;
st.push(start);
visited[st.top() - 'a'] = true;
while (!st.empty())
{
current = st.top();
st.pop();
for (i = 0; i < N[current].size(); i++)
{
next = N[current][i];
if (visited[next - 'a'] == false)//방문한 적이 없으면
{
st.push(next);
visited[next - 'a'] = true;
}
if (visited[end - 'a'])//도착했다면?
{
return true;
}
}
}
return false;
}
void find_answer(map<char, vector<char>>& N, vector<pair<char, char>>& M)
{
int n = N.size(), m = M.size();
int i;
bool answer;
for (i = 0; i < m; i++)
{
answer = DFS(M[i].first, M[i].second, N);//출발지, 도착지, 정보
if (answer)
{
cout << "T\n";
}
else
{
cout << "F\n";
}
}
return;
}
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
map<char, vector<char>> N;
vector<pair<char, char>> M;
input_info(N, M);
find_answer(N, M);
return 0;
}