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。(因为搜索的树不一定是链,所以后面那个程序那种写法不行)