Algorithm 坚持DFS/BFS任务(USACO银牌)

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

这里没有竞争性编程。我一直在努力解决这个问题:

我编写的代码只适用于第一个测试用例,并为其余测试用例提供了内存限制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;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;
    }