解决思路:
利用0-1构建二叉树,根据二进制数表示节点的选择情况。
然后根据父子的下标关系,判断此二进制数是否合法,选择所有的二进制数计算最大值。
源码如下:
/*
Author ziacke.
2014-09-14.
Copyright Reserved.
*/
#include<iostream>
#include<math.h>
using namespace std;
//demical number change to binary number by the following function
int *tentobin(int n,int num)
{
int old=num;
int *digit=new int[num];
for(int i=0;i<num;i++)digit[i]=0;
num--;
while(n)
{
digit[num]=n%2;
num--;
n=n/2;
}
return digit;
}
int fat(int num,int *a ,int *b,int *v)
{
int *digit=new int[num];
int row;row =pow(2.0,num);
int max=0;
for(int i=1;i<row;i++)
{
int flag=0;
//for each number from i to row,change to binary represention just indicate the chosen e.g 0 isnot chosen but 1 is.
digit=tentobin(i,num);
for(int i=0;i<num-1;i++)
{
if(digit[a[i]-1]==1&&digit[b[i]-1]==1)
{
flag=1;
for(int i=0;i<num;i++)
digit[i]=0;
break;
}
}
//calculate the max value
int temp=0;
for(int j=0;j<num;j++)
temp+=v[j]*digit[j];
if(max<=temp)max=temp;
}
return max;
}
void main()
{
int nodeNum;
cin>>nodeNum;
int *value=new int[nodeNum];
//constuct two int array to store the input data
int *a=new int[nodeNum-1];
int *b=new int[nodeNum-1];
for(int i=0;i<nodeNum;i++)
cin>>value[i];
for(int i=0;i<nodeNum-1;i++)
cin>>a[i]>>b[i];
cout<<fat(nodeNum,a,b,value);
}