给定的是一棵无向树
要求他的最小支配集
这里用的是贪心的算法,进行树的后序遍历
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 10000+7, INF = 0x3f3f3f3f;
int n, ans;
vector<int> a[maxn];
bool vis[maxn], have[maxn];
void dfs(int id, int f) {
vis[id] = 1;
bool flag = false;
for(int i = 0; i < a[id].size(); ++i)
if(!vis[a[id][i]])
dfs(a[id][i], id), flag = (flag||have[a[id][i]]);
if(f == -1) ans += !(have[id] || flag);
else if(!have[f] && !have[id] && !flag)
have[f] = 1, ans++;
}
int main() {
scanf("%d", &n);
int u, v;
for(int i = 1; i < n; ++i) {
scanf("%d %d", &u, &v);
a[u].push_back(v);
a[v].push_back(u);
}
memset(vis, 0, sizeof(bool)*(n+1));
memset(have, 0, sizeof(bool)*(n+1));
ans = 0;
dfs(1, -1);
printf("%d\n", ans);
return 0;
}