题目+提交地址
简单深搜:记录两个子节点,和父节点,搜索的时候标记已经遍历过的元素
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
#define de(x) cout<<x<<" ";
#define Pu puts("");
#define sf(x) scanf("%lld",&x);
#define int long long
const int N=1e2+10,inf=0x3f3f3f3f3f3f3f3f;
struct node{
int l,r,w,fa;
}s[N];
int vis[N];
int res,ans,n;
void dfs(int tou,int dep){
res+=dep*s[tou].w;
int z,y,ss;
z=s[tou].l;y=s[tou].r;ss=s[tou].fa;
if(z&&!vis[z]) {vis[z]=1;dfs(z,dep+1);}
if(y&&!vis[y]) {vis[y]=1;dfs(y,dep+1);}
if(ss&&!vis[ss]) {vis[ss]=1;dfs(ss,dep+1);}
return ;
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
sf(s[i].w) sf(s[i].l) sf(s[i].r)
s[s[i].l].fa=i;
s[s[i].r].fa=i;
}
ans=inf;
for(int i=1;i<=n;i++){
res=0;
memset(vis,0,sizeof(vis));
vis[i]=1;
dfs(i,0);
ans=min(ans,res);
}
printf("%lld\n",ans);
}