您的位置:首页 > 其它

树的最小支配集

2015-09-07 19:53 260 查看
/**
    最小支配集,就是图中用最少的点覆盖其它所有点
    如果用选A点覆盖,则与A点相连的点都被覆盖,大致
    就是这样
    百度里面搜到一道题
    有一个图G,现在希望在一些点建立控制站,每个控制站能控制与它相临的点(直接相连),
    现在希望有选择的在一些点建立控制站,使得以最小得控制站数,控制所有的点

    图的最小支配集是NP 问题,我只会树的最小支配集模板,就是
    图G 是树形结构

    判断树的最小支配集,条件如下
    1、选一结点为根后序遍历
    2、遍历过程中,如果该结点没被覆盖,该结点的父亲结点没被覆盖,且
    该结点的子结点中没有被覆盖的,则该结点的父亲结点即为一覆盖点

    就上面两个条件即可实现,证明不会,自己画画就能懂

    现在用vector 存边来写下

    #include <vector>

    vector<int> adj[M];
    bool vis[M], over[M];
    int ans;

    //初始化: vis, over, ans = 0

    //调用dfs(1, 1), 选 1 为根节点

    void dfs(int u, int fa) {
    //根节点判断可省去判断父亲结点
        vis[u] = 1;
        bool flag = false;
        for (int i=0; i<adj[u].size(); i++) {
            int v = adj[u][i];
            if (!vis[v]) {
                dfs(v, u);
                flag = flag || over[v];
            }
        }
        if (!over[fa] && !flag && !over[u]) {
        //父亲结点没覆盖,没子结点覆盖,本身没覆盖,3个条件
            over[fa] = 1;
            ans++;
        }
    }

    ans即为最小支配集得个数,over[x] 表示x点被覆盖

    POJ 3659

*/

收藏于 2012-01-20
来自于百度空间
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: