此题求助
查看原帖
此题求助
316827
Temperature_automata楼主2020/9/21 13:13

遇到了一些未知错误,使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部分出错,请大佬纠正

2020/9/21 13:13
加载中...