加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

POJ 3659 树的最小支配集

(2010-09-27 20:27:22)
标签:

poj

3659

树的最小支配集

it

分类: 图论

题目描述:

给你一棵无向树,问你最少用多少个点可以覆盖掉所有其他的点。

(一个点被盖,它自己和与它相邻的点都算被覆盖)

解题报告:

贪心,随便找一个根,后续遍历树。

每个点,如果它的孩子都没有真正覆盖的,同时他自己和他父亲都没有真正覆盖的,就把它的父亲覆盖,答案加一。

题目描述:

#include<iostream>
#include<vector>
using namespace std;
int n, ans;
vector<int> v[10001];
bool vst[10001], have[10001];
void jeo(int id, int from)
{
    vst[id] = 1; bool flag = false;
    for(int i = 0; i < v[id].size(); i++)
        if (!vst[v[id][i]])
            jeo(v[id][i], id), flag = flag || have[v[id][i]];
    if (from == -1) ans += !(have[id] || flag);
    else if (!have[from] && !have[id] && !flag)
        have[from] = 1, ans++;
}
int main()
{
    scanf("%d", &n);
    for(int i = 1; i < n; i++)
    {
        int a, b;scanf("%d%d", &a, &b);
        v[a].push_back(b);
        v[b].push_back(a);
    }
    memset(vst, 0, sizeof(bool) * (n + 1));
    memset(have, 0, sizeof(bool) * (n + 1));
    ans = 0; jeo(1, -1);
    printf("%d\n", ans);
    return 0;
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有