说起来都是泪啊
T3的bfs一直不对,我想死。
考试时候苟了两个小时,死活找不到错误(因为lca和离散化都码出来了,太乱)
最后把bfs单独提出来,发现在bfs里面输出的f[ly][0]都是正确的,到外面就彻底崩掉,全是0。
又调了一节课,终于发现
数组越界了。。。
错误代码
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<algorithm> #include<queue> #define rint register int using namespace std; int n,m,a,b,tot,first[100005]; int deep[100005],f[100005][18]; struct node{ int u,v,nxt; }edge[100005]; inline void add(int u,int v) { ++tot; edge[tot].u=u; edge[tot].v=v; edge[tot].nxt=first[u]; first[u]=tot; } inline void bfss() { queue <int> q; deep[1]=1; q.push(1); while(!q.empty()) { int lq=q.front();q.pop(); for(rint i=first[lq];i;i=edge[i].nxt) { int ly=edge[i].v; if(ly==0)continue; if(deep[ly])continue; deep[ly]=deep[lq]+1; f[ly][0]=lq; cout<<ly<<":fa:"<<f[ly][0]<<endl; // cout<<f[20][0]<<endl; for(rint j=1;j<=18;++j) { f[ly][j]=f[f[ly][j-1]][j-1]; printf("f[%d][%d]=%d\n",ly,j,f[ly][j]); } q.push(ly); } } return ; } int main() { scanf("%d %d",&n,&m); for(rint i=1;i<n;++i) { scanf("%d %d",&a,&b); add(a,b);add(b,a); } bfss(); cout<<f[20][0]<<endl; }
正确代码
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<algorithm> #include<queue> #define rint register int using namespace std; int n,m,a,b,tot,first[100005]; int deep[100005],f[100005][18]; struct node{ int u,v,nxt; }edge[100005]; inline void add(int u,int v) { ++tot; edge[tot].u=u; edge[tot].v=v; edge[tot].nxt=first[u]; first[u]=tot; } inline void bfss() { queue <int> q; deep[1]=1; q.push(1); while(!q.empty()) { int lq=q.front();q.pop(); for(rint i=first[lq];i;i=edge[i].nxt) { int ly=edge[i].v; if(ly==0)continue; if(deep[ly])continue; deep[ly]=deep[lq]+1; f[ly][0]=lq; cout<<ly<<":fa:"<<f[ly][0]<<endl; // cout<<f[20][0]<<endl; for(rint j=1;j<=17;++j) { f[ly][j]=f[f[ly][j-1]][j-1]; printf("f[%d][%d]=%d\n",ly,j,f[ly][j]); } q.push(ly); } } return ; } int main() { scanf("%d %d",&n,&m); for(rint i=1;i<n;++i) { scanf("%d %d",&a,&b); add(a,b);add(b,a); } bfss(); cout<<f[20][0]<<endl; }
我想去死怎么办。。。