#include#include#includeusing namespace std;
ifstream fin("c:\\data19.in");
struct node
int data;
int c;
int gc;
struct node* parent;
struct node* left;
struct node* right;
};class bstree
void init();
node* searchnode(node* nd,int n);
void insertnode(int n);
void afterorderwalk(node*);
node* getroot();
void emptytree(node*);
void print(node* nd);
void freshnode(node* nd);
void maxsubnode(node* nd);
private:
node* root;
};void bstree::init()
datanode->parent=y;
if(root==null)
root=datanode;
else }
void bstree::afterorderwalk(node* nd)
}void bstree::emptytree(node* nd)
}node* bstree::getroot()
//採用中序遍歷的方法顯示樹的結構
void bstree::print(node* nd)
else
coutcout<<"(";
print(nd->left);
cout<<",";
print(nd->right);
cout<<")";
}//核心**
//因為要遍歷所有的子節點並在遍歷的過程中更新父節點的資料
//採用後序遍歷的方法
void bstree::freshnode(node* nd)
}void bstree::maxsubnode(node *nd)
樹的最大獨立集
題意 對於一棵有n個結點的無根樹,選出盡量多的結點,使得任何兩個結點均不相鄰 稱為最大獨立集 sol 樹形dp 由於每個點只由其兒子或者孫子決定 二者的最大值 所以我們可以深搜一遍,回溯的時候用當前節點更新其父親以及父親的父親 因為此時該節點的值已經被我們計算出來了 這種由已知貢獻給未知的方法稱為刷...
uva1220樹的最大獨立集
題意 公司裡除了老闆,每個人都有乙個直屬上司,要求選盡量多的人,但不能同時選乙個人和他的直屬上司,問最多能選多少個人,以及在人數最多的情況下方案是否唯一。思路 d u 0 表示不選u點能得到的最大人數d u 0 sum d u 1 表示選u點能得到的最大人數d u 1 sum f u 0 表示不選u...
uva1220 樹的最大獨立集 判重
題意是挑選盡量多的人,並且每個人都不和他的父節點同時出現,很明顯的最大獨立集問題,難點在於如何判斷方案是否唯一。詳情請見劉汝佳 演算法競賽入門經典 第二版 p282 include include include include include include include define inf ...