Files
Data-Structure/Algorithm/DP-DynamicProgramming/Tree-DP/树的最大独立集.cpp
2025-09-15 22:16:09 +08:00

51 lines
1.1 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
}