#include #include #include using namespace std; void dfs(vector>& d, const vector>& adj_, vector& vs, int v){ d[v][0] = 0; d[v][1] = 1; for(auto x : adj_[v]){ if(vs[x] == false) { vs[x] = true; dfs(d, adj_, vs, x); //回溯 d[v][0] += max(d[x][0], d[x][1]); // 不选u,子树可自由选 d[v][1] += d[x][0]; // 选u,子树必须不选根 } } } int main(){ //图的话直接用vector存邻接表即可 int n; cin >> n; vector> adj(n); vector> dp(n, vector(2, 0)); vector visited(n, false); //vector> choose(n, vector(n, 0)); //这里节点从0开始到n - 1 for(int i = 0; i < n - 1; i++){ int a, b; cin >> a >> b; adj[a].push_back(b); adj[b].push_back(a); } /* for(int l = 2; l <= n; l++){ for(int i = 0; i < n - l + 1; i++){ int j = i + l - 1; for(int k = i; k < j; k++){ if(adj[i][j]) d[i][j] = max(dp[i][j], ) } } }*/ visited[0] = true; dfs(dp, adj, visited, 0); // 以0为根 cout << max(dp[0][0], dp[0][1]) << endl; return 0; }