这是一篇 不AC的 代码,,马下来待改错
按题目所说的是 一棵树的话 最小支配集应该能过啊,,,but 死活过不了,
---------------------------------- 雾)
更新一发,,这个写法确实是不对的,因为最小结点覆盖 和 最小边覆盖 不能混为一谈,两者他妈根本就不是一回事
画个有6个结点的链就知道了,结点覆盖的答案是2,边覆盖的答案是3;
反思:还是要看清楚题意啊,理解透算法的本质
#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++;
}
void init() {
int u, v, cnt;
for(int i = 0; i < n; ++i) {
scanf("%d:(%d)", &u, &cnt);
u++;
for(int j = 0; j < cnt; ++j) {
scanf("%d", &v);
v++;
a[u].push_back(v);
a[v].push_back(u);
}
}
}
int main() {
while(~scanf("%d", &n)) {
init();
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;
}