Algorithm 坚持DFS/BFS任务(USACO银牌)
这里没有竞争性编程。我一直在努力解决这个问题: 我编写的代码只适用于第一个测试用例,并为其余测试用例提供了内存限制EXCEND error或(“!”)。 这是我的代码(意外地混淆了M和N):Algorithm 坚持DFS/BFS任务(USACO银牌),algorithm,graph-theory,depth-first-search,Algorithm,Graph Theory,Depth First Search,这里没有竞争性编程。我一直在努力解决这个问题: 我编写的代码只适用于第一个测试用例,并为其余测试用例提供了内存限制EXCEND error或(“!”)。 这是我的代码(意外地混淆了M和N): #包括 #包括 #包括 使用名称空间std; 使用std::vector; 向量检查; 向量A; 无效dfs(int节点) { 检查[节点]=1; int siz=A[node].size(); 对于(int i=0;iM>>N; 检查。调整大小(M+1); A.调整大小(M+1); 对于(int i=0
#包括
#包括
#包括
使用名称空间std;
使用std::vector;
向量检查;
向量A;
无效dfs(int节点)
{
检查[节点]=1;
int siz=A[node].size();
对于(int i=0;iM>>N;
检查。调整大小(M+1);
A.调整大小(M+1);
对于(int i=0;i>u>>v;
A[u]。向后推(v);A[v]。向后推(u);
}
dfs(1);
如果(!已连接(检查)){
库特
您的DFS占用了大量堆栈,因此导致MLE
尝试使用使用队列的BFS实现它。尝试将队列保持为全局队列而不是本地队列
你的方法会给你时间限制。试着更有效地解决它。说O(n)
您的DFS占用了大量堆栈,因此导致MLE
尝试使用使用队列的BFS实现它。尝试将队列保持为全局队列而不是本地队列
你的方法会给你时间限制。试着更有效地解决它。说O(n)
问题可能出在DFS的递归实现中。每次调用都会向调用堆栈添加至少sizeof(node)+sizeof(siz)+sizeof(y)+sizeof(void(*)()
字节,并且调用堆栈的大小相当有限(通常为1–8 Mb)。在最坏的情况下,它将进行200000个递归调用,并导致堆栈溢出。如果通过引用将C传递给connected,是否有帮助?啊!这就是它给出MLE错误的原因。非常感谢您的帮助!问题可能出在DFS的递归实现中。每个调用都至少添加sizeof(node)+sizeof(siz)+sizeof(y)调用堆栈的+sizeof(void(*)()
字节,并且调用堆栈的大小相当有限(通常为1–8 Mb)。在最坏的情况下,它将进行200000次递归调用,并导致堆栈溢出。如果通过引用将C传递给connected,是否有帮助?啊!这就是它给出MLE错误的原因。非常感谢您的帮助!嘿,非常感谢您的建议!我使用BFS方法重新编写了代码,并且成功了(10/10测试用例).但这是否意味着对于此类问题,我应该使用BFS方法而不是DFS来避免MLE(除非问题只能通过DFS方法解决)?有些问题显然需要DFS。比如自下而上的DPs。DFS是一个非常重要的概念,需要理解。但是,无论你在哪里看到它,你都应该使用BFS。嘿,非常感谢你的建议!我使用BFS方法重新编写了代码,它起了作用(10/10测试用例).但这是否意味着对于这类问题,我应该使用BFS方法而不是DFS来避免MLE(除非该问题只能通过DFS方法解决)?有些问题显然需要DFS。例如自底向上DPs。DFS是一个非常重要的概念,需要理解。但无论你在哪里看到它,你都应该使用BFS。
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
using std::vector;
vector<int> check;
vector< vector<int> > A;
void dfs(int node)
{
check[node] = 1;
int siz = A[node].size();
for (int i = 0; i < siz; i++)
{
int y = A[node][i];
if (check[y] == 0)
{
dfs(y);
}
}
}
bool connected(vector<int> C)
{
for (int i = 1; i <= C.size() - 1; i++)
{
if (C[i] == 0)
{
return false;
}
}
return true;
}
int main()
{
freopen("closing.in", "r", stdin);
freopen("closing.out", "w", stdout);
ios_base::sync_with_stdio(false);
int M, N;
cin >> M >> N;
check.resize(M + 1);
A.resize(M + 1);
for (int i = 0; i < N; i++)
{
int u, v;
cin >> u >> v;
A[u].push_back(v); A[v].push_back(u);
}
dfs(1);
if (!connected(check)) {
cout << "NO" << "\n";
}
else {
cout << "YES" << "\n";
}
fill(check.begin(), check.end(), 0);
for (int j = 1; j < M; j++)
{
int node;
bool con = true;
cin >> node;
check[node] = -1;
for (int x = 1; x <= N; x++)
{
if (check[x] == 0)
{
dfs(x);
break;
}
}
if (!connected(check)) {
cout << "NO" << "\n";
}
else {
cout << "YES" << "\n";
}
for (int g = 1; g <= M; g++)
{
if (check[g] == 1)
{
check[g] = 0;
}
}
}
return 0;
}