最小点覆盖P2899

 

P2899

 

 

#include<bits/stdc++.h>
using namespace std;
int n;
const int maxn=1e5+5;
vector<int> v[maxn];
int vis[maxn];
int f[maxn][3];
//f(i,0)i点放置灯,以i为根结点的子树所产生的满足条件的最小总数 f(i,0)+=min(f(i,0),f(i,1),f(i,2))
//解释:如果i放了,那么它的方案可由它子节点没放灯所产生的满足条件的最优解,
//子节点放了灯所产生的满足条件的最优解,和要父亲放了灯才产生的满足条件的最优解的三种选其一(最小)转移过来。
//f(i,1)i的子结点放置灯,i为根结点的子树所产生的满足条件的最小总数f(i,1)+=min(f(i,0),f(i,1))
//如果i没放,那么它的子节点要有一个放的,同时还要满足放的灯最少,那么我们可以这样考虑:
//对于它的每个子节点我们都从子结点放或不放中选择最小值,肯定是最小数,但如果子节点都选择了不放也就是f(j,1)是不行的,
//所以特判一下,如果子节点都是选择f(i,1),我们再从所有子节点中挑一个最小的改变也就是最小的一个f(j,0)中计算f(i,1)+=(-f[i,1]+f[i,0])最
//f(i,2)i的父节点放置灯,i为根结点的子树所产生的满足条件的最小总数
//这是要求父节点必须放置,那么它可放可不放,从min(f(j,0),f(j,1))转移
const int INF=0x3f3f3f3f;
void dfs(int x)
{
    vis[x]=1;
    f[x][0]=1;
    int flag=0;
    int fy=INF;

    int flag1=0;
    for(int i=0; i<v[x].size(); i++)
    {
        int y=v[x][i];
        if(vis[y]) continue;
        flag1=1;
        dfs(y);
        f[x][0]+=min(f[y][0],min(f[y][1],f[y][2]));
        if(f[y][0]<=f[y][1])
        {
            flag=1;
            f[x][1]+=f[y][0];
        }
        else
        {
            f[x][1]+=f[y][1];
            if((f[y][0]-f[y][1])<fy) // 选择差值最小进行贪心~
            {
                fy=f[y][0]-f[y][1];
            }

        }
        f[x][2]+=min(f[y][0],f[y][1]);
    }
    if(flag==0)
        f[x][1]+=fy;
    if(flag1==0)
    {
        f[x][0]=1;
        f[x][1]=INF;
        f[x][2]=0;
    }
}

int main()
{
    scanf("%d",&n);
    for(int i=1; i<=n-1; i++)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        v[a].push_back(b);
        v[b].push_back(a);
    }
    dfs(1);
    printf("%d",min(f[1][0],f[1][1]));
}

 

转载于:https://www.cnblogs.com/dongdong25800/p/11033203.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值