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);
}
- acm-1
- ACM 1
- acm 1
- ACM(1)
- acm题解总结(1)
- ACM算法集1
- acm竞赛小结1
- acm集训1
- acm反思1
- ACM培养计划1
- 十八周 acm--1
- acm笔记(1)
- ACM n-1位数
- acm学习总结1
- 南阳理工acm 1
- ACM--steps--3.1.1
- acm 竞赛1
- ACM-- n-1位数
- redis基础之集合类型
- 解决了一个ios真机上的内存越界问题
- 快速排序 Java
- 笔记:VIM随时随地做运算
- Lex与Yacc的使用
- ACM(1)
- Python抓取单个网页中所有的PDF文档
- 2014年,天猫双十一会达到怎么样的交易数据呢?
- ViewPage的监听类SimpleOnPageChangeListener
- 【DP】 POJ 2955 Brackets 区间DP
- VIM笔记:构造可重复删除
- 关于java中多态的理解,涉及到内存空间
- 一些巧妙的算法
- java基础之堆、栈、方法区 继承 多态