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

原创粉丝点击