求助递归爆栈问题
  • 板块学术版
  • 楼主HAuCl4
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/10/29 18:57
  • 上次更新2023/10/27 05:07:25
查看原帖
求助递归爆栈问题
289304
HAuCl4楼主2022/10/29 18:57

RT。某道图论题,其中的一部分我写了个深搜一棵树,结果发现TLE了。我造了一个长为1e5的链的数据,结果发现是深搜RE了。

这是我的部分代码:

#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int n;
int hd[N],nxt[2*N],to[2*N],tif;
void add(int x,int y)
{
    to[++tif]=y;
    nxt[tif]=hd[x];
    hd[x]=tif;
}
void link(int x,int y)
{
    add(x,y);
    add(y,x);
}
void dfs1(int u,int fa)
{
    if(u%10000==0) printf("u=%d\n",u);
    for(int i=hd[u];i;i=nxt[i])
    {
        int v=to[i];
        if(v==fa) return;
        dfs1(v,u);
    }
}
int main()
{
    freopen("1.in","r",stdin);
    scanf("%d",&n);
    for(int i=1,ta,tb;i<n;i++)
    {
        scanf("%d%d",&ta,&tb);
        link(ta,tb);
    }
    printf("tif=%d\n",tif);
    dfs1(1,0);
    return 0;
}

1.in中第一行是100000,后面每一行是 i i+1。

然而它RE了。在u=20000左右就RE了。

我改了一下,只改了搜索的部分

#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int n;
int hd[N],nxt[2*N],to[2*N],tif;
void add(int x,int y)
{
    to[++tif]=y;
    nxt[tif]=hd[x];
    hd[x]=tif;
}
void link(int x,int y)
{
    add(x,y);
    add(y,x);
}
void dfs1(int u,int fa)
{
    if(u%10000==0) printf("u=%d\n",u);
    int v=to[hd[u]];
    if(v==fa) return;
    dfs1(v,u);
}
int main()
{
    freopen("1.in","r",stdin);
    scanf("%d",&n);
    for(int i=1,ta,tb;i<n;i++)
    {
        scanf("%d%d",&ta,&tb);
        link(ta,tb);
    }
    printf("tif=%d\n",tif);
    dfs1(1,0);
    return 0;
}

只有这样才能不RE。

求助,怎样让前一个程序不RE。(因为搜索的树不一定是链,所以后面那个程序那种写法不行)

2022/10/29 18:57
加载中...