zoukankan      html  css  js  c++  java
  • $UVA1292$ $Strategic$ $game$

    链接

    背景

    (2000-2001) (Southeastern) (European) (Regional) (Programming) (Contest) ( (ICPC) (SEERC) (2000) ) (A) 题, (UVA1292)

    题意

    对于多组数据,每次以节点、儿子个数及其儿子集合的形式给出一棵 (n) 个点的无根树(点从 (0) 标号至 (n-1) ),规定一个节点可以覆盖距离它不超过 (1) 的所有节点,求全图能被覆盖住要使用的最少点数。

    解法

    又是树形(dp)模板。
    自然地,设 (f_{x,0/1}) 表示 (x) 节点不使用和使用时覆盖以 (x) 为根的子树的最小代价。
    问题来了,给定的树没根,咋办?(话说这个傻逼问题足足困扰了我二十分钟。。。。。。)
    只要随便选个根就是有根树啦!
    为了方便,不妨设 (1) 号节点为根,则直接从 (1) 号点开始 (dfs) 出所有点的父亲即可。
    现在回到转移上来。设边集为 (E) ,自然地,有 (f_{x,0}=sum_limits{(x,y) in E} f_{y,1},f_{x_1}=sum_limits{(x,y) in E} min { f_{y,0},f_{y,1} }+1) 。那么要求的就是 (min {f_{1,0},f_{1,1} })

    细节

    (1.) 由于给定的点是 ([0,n-1]) 内的,考虑读入的时候统一 (+1) 移至正整数区间内再做。

    (2.) 多组数据记得清空,且信仰边数不会太多,别开太大容易超时。

    代码

    $View$ $Code$ ```cpp #include using namespace std; inline int read() { int ret=0,f=1; char ch=getchar(); while('9'
  • 相关阅读:
    DevOps
    DevOps
    DevOps 教程
    Java 文件
    Java 包装类
    Java HashMap
    Java 包装类
    Java 文件
    Java ArrayList
    Java 日期与时间
  • 原文地址:https://www.cnblogs.com/Peter0701/p/11837851.html
Copyright © 2011-2022 走看看