某企业校招的编程题目,问题大致描述如下:
有一棵树有N个节点,其中有K个节点有苹果。在每条边至多走一次的情况下,最多可以摘到的苹果数。其中,可以从任意一个节点出发。
代码如下:
import java.util.*;
public class Main {
public static void main(String[] args) {
Solution s=
new Solution();
int a[]={
2,
3,
5,
6};
int b[][]={{
1,
2},{
1,
3},{
2,
5},{
2,
4},{
3,
6},{
3,
7},{
6,
8}};
int res = s.collectApples(
8,
4,a ,b);
System.
out.println(res);
}
}
class Node{
private boolean at;
private int num;
private boolean apple;
List<Node> childs=
new ArrayList<Node>();
public Node(Node p, boolean a,
int num){
this.apple=a;
this.num=num;
}
public void add(Node node){
this.childs.add(node);
}
public boolean
isAccess(){
return this.at;
}
public boolean
existApple(){
return this.apple;
}
public void noAccess(){
this.at=
false;
}
public void access(){
this.at=
true;
}
public String
toString(){
return String.valueOf(num);
}
public void printChilds(){
for (
int i =
0; i < childs.size(); i++) {
System.
out.print(childs.
get(i)+
",");
}
System.
out.println();
}
}
class Solution
{
int collectApples(
int N,
int K,
int[] applesAtNodes,
int[][] connectedNodes)
{
Map<Integer, Node> map=
new HashMap<Integer, Node>();
for(
int i=
0;i<K;i++){
int cur = applesAtNodes[i];
Node node=
new Node(
null,
true,cur);
map.put(cur,node);
}
int m=connectedNodes.length;
for(
int i=
0;i<m;i++){
int pNum=connectedNodes[i][
0];
int cNum=connectedNodes[i][
1];
Node pn;
Node cn;
if(map.containsKey(pNum)){
pn=map.
get(pNum);
}
else{
pn=
new Node(
null,
false,pNum);
map.put(pNum, pn);
}
if(map.containsKey(cNum)){
cn=map.
get(cNum);
}
else{
cn=
new Node(pn,
false,cNum);
map.put(cNum, cn);
}
pn.add(cn);
cn.add(pn);
}
int max=-
1;
for(Node node:map.values()){
resetNoAccess(map);
int num1=search(node);
max=Math.max(max,num1);
}
return max;
}
void resetNoAccess(Map<Integer, Node> map){
for(Node node:map.values()){
node.noAccess();
}
}
int search(Node node){
if(node==
null || node.isAccess())
return 0;
node.access();
int num2=
0;
for(
int i=
0;i<node.childs.size();i++){
int cur=search(node.childs.
get(i));
num2=Math.max(cur,num2);
}
if(node.existApple())
return 1 + num2;
else return num2;
}
}