记录:
用链式前向星存的图,一直没过,找了好久啊,结果是数组 忘记开2倍了.....,因为链式前向星每条边要存两遍啊!!!
还有ans要 = -0x3f3f3f3f;
-0x3f 大了。
注解:
dfs函数 返回的值是 以该点为根的这棵小树 的最大美丽指数 ;
其实题目没有规定根,
我们可以自己规定任意存在的点为根,( 就是抓住我们选择的点 把树拎起来了)
俺滴代码:
#include<iostream>
using namespace std;
int n,ans=-0x3f3f3f3f;
int h[40000],v[40000],ne[40000];
int w[20000];
int idx; //从1开始存;
void add(int x,int y){
ne[++idx]=h[x]; h[x]=idx; v[idx]=y;
}
int dfs(int x,int fa){
int sum=0;
for(int i=h[x];i>0;i=ne[i]){
int y=v[i];
if(y==fa) continue;
int temp=dfs(y,x);
if(temp>0) sum+=temp;
}
sum+=w[x];
if(ans<sum) ans=sum;
return sum;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d",&w[i]);
for(int i=1;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
dfs(1,0);
printf("%d",ans);
return 0;
}