原题
点此链接1
题目分析
题目考察的就是建图和图的搜索(DFS与BFS)两块内容,值得分析的是可以尝试使用非递归DFS来实现这个问题。
代码
#include <iostream>
#include <vector>
#include <queue>
#include <string>
#include <algorithm>
#include <stack>
#include <list>
using namespace std;
using std::cout;
void dfs(vector<vector<int>> &data, int &v, vector<bool> &vis)
{
vis[v] = true;
cout << v << " ";
for (auto r : data[v])
{
if (vis[r])
continue;
dfs(data, r, vis);
}
}
int main()
{
vector<vector<int>> data;
int n, e;
cin >> n >> e;
data.resize(n);
for (auto i = 0; i < e; i++)
{
int a, b;
cin >> a >> b;
data[a].push_back(b);
data[b].push_back(a);
}
for (auto i = 0; i < n; i++)
sort(data[i].begin(), data[i].end(), [](int l, int r) { return l < r; });
// DFS
{
vector<bool> visited(n, false); // false not, true yes
for (auto i = 0; i < n; i++)
{
if (visited[i])
continue;
std::cout << "{ ";
// The recursive implementation
// dfs(data, i, visited);
// The non recursive implementation
{
list<int> lis;
lis.push_back(i);
visited[i] = true;
while (!lis.empty())
{
auto node = lis.back();
lis.pop_back();
std::cout << node << " ";
visited[node] = true;
for (auto iter = data[node].rbegin(); iter != data[node].rend(); ++iter)
{
auto r = *iter;
if (visited[r])
continue;
lis.remove(r);
lis.push_back(r);
}
}
}
std::cout << "}" << endl;
}
}
// BFS
{
vector<bool> visited(n, false); // false not, true yes
for (auto i = 0; i < n; i++)
{
if (visited[i])
continue;
visited[i] = true;
queue<int> que;
que.push(i);
cout << "{ ";
cout << i << " ";
while (!que.empty())
{
auto node = que.front();
que.pop();
for (auto r : data[node])
{
if (visited[r])
continue;
visited[r] = true;
que.push(r);
cout << r << " ";
}
}
cout << "}" << endl;
}
}
return 0;
}