题目链接:图的遍历 - 洛谷
在写这题的时候,我的想法是深搜+记忆化
代码如下
#include <bits/stdc++.h>
using namespace std;
vector<int> vec[100100];
int vis[100100];
bool viss[100100];
int n, m;
int nn = 1;
int dfs(int x)
{
if (vec[x].size() == 0)
{
return x;
}
for (int i = 0; i < vec[x].size(); i++)
{
if (!viss[vec[x][i]])
{
viss[vec[x][i]] = 1;
int s = 0;
s = dfs(vec[x][i]);
vis[x] = max(s, vis[x]);
}
else
{
vis[x] = max(vis[x], vis[vec[x][i]]);
}
}
return vis[x];
}
void slove()
{
for (int i = 1; i <= m; i++)
{
int x, y;
cin >> x >> y;
vec[x].push_back(y);
}
for (int i = 1; i <= n; i++)
{
vis[i] = i;
sort(vec[i].begin(), vec[i].end());
}
viss[1] = 1;
dfs(1);
for (int i = 1; i <= n; i++)
cout << vis[i] << ' ';
}
int main()
{
int t = 1;
while (t--)
{
cin >> n >> m;
slove();
}
return 0;
}
但提交显示是错误的
错误的原因是:当遍历时,如果搜索到之前正在被搜索而没有得到答案的点;
如下图
正确的输出时 4 4 4 4
而该代码的输出为 4 4 3 4
原因是搜索3时 2同时也在等待4的答案;
正解代码就不列出了 网上有很多。