ACM(1)

来源:互联网 发布:埃舍尔 知乎 编辑:程序博客网 时间:2024/05/22 04:48

解决思路:

利用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);


}


0 0