遇到了一些未知错误,使dfs无限递归了
求大佬帮忙
#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
struct node{
//居民数
int data;
//此节点父亲的下标
int father;
//此节点左孩子右孩子的下标
int lchild,rchild;
}tree[10005];//树
int n,ans;
int g[10005][10005];//两点距离计算
int dfs(int i,int j,int step)
{
int p=0x7f;
if(i==j)return step;
if(g[i][j]!=-1)return g[i][j];
if(step>100005)return 0;
if(tree[j].father!=-1)
p = min(dfs(i,tree[j].father,step+1),p);
if(tree[j].lchild!=-1)
p = min(dfs(i,tree[j].lchild,step+1),p);
if(tree[j].rchild!=-1)
p = min(dfs(i,tree[j].rchild,step+1),p);
if(p!=0x7f)return p;
else return -1;
}
int main()
{
memset(tree,-1,sizeof(node));
memset(g,-1,sizeof(tree));
cin >> n;
int a,b;//左右孩子
for(int i = 1;i <= n; ++i)
{
cin >> tree[i].data;//输入居民数
cin >> a >> b;
if(a!=0)
{
tree[a].father=i;
tree[i].lchild=a;//将孩子的父亲,父亲的孩子设置好
}
if(b!=0)
{
tree[b].father=i;
tree[i].rchild=b;//与前面一样
}
}
//好了,现在每个节点的信息都好了
//开始遍历距离(时间复杂度要炸的样纸)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(g[i][j]==-1)
{
g[i][j] = dfs(i,j,0);
}
}
for(int i=1;i<=n;i++)
{
int k=0;
for(int j=1;j<=n;j++)
{
k += g[i][j]*tree[j].data;
}
ans = min(ans, k);
}
cout<<ans;
return 0;
}
dfs部分出错,请大佬纠正