51 lines
1.1 KiB
C++
51 lines
1.1 KiB
C++
#include <iostream>
|
||
#include <utility>
|
||
#include <vector>
|
||
using namespace std;
|
||
void dfs(vector<vector<int>>& d, const vector<vector<int>>& adj_, vector<bool>& 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<vector<int>> adj(n);
|
||
vector<vector<int>> dp(n, vector<int>(2, 0));
|
||
vector<bool> visited(n, false);
|
||
//vector<vector<int>> choose(n, vector<int>(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;
|
||
}
|