HDU
来源:互联网 发布:csrf攻击php 编辑:程序博客网 时间:2024/06/03 22:47
这是一篇 不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;}