首页 > 其他分享 >Strategic game POJ - 1463 树的最小点覆盖,树形dp

Strategic game POJ - 1463 树的最小点覆盖,树形dp

时间:2023-09-20 11:45:12浏览次数:41  
标签:rt 覆盖 min int 不选 Strategic game POJ include

题意:树的最小点覆盖,选择最少的点覆盖所有边。

分析:

  1. 状态:f[u][0/1] 表示不选/选编号u的点的最优解
  2. 转移:
    不选u,则一定选u的儿子v,即 f[u][0] +=f[v][1]
    选u,则可以选,也可以不选u的儿子v,即 f[u][1] += min(f[v][0], f[v][1]);
  3. 目标:ans = min(f[rt][0], f[rt][1]);
点击查看代码
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long LL;
const int N = 1e6 + 10, INF = 0x3f3f3f3f;
struct T {
    int v, nx;
} g[N << 1];
int h[N], idx, f[N][2];
bool st[N];
void add(int u, int v) {
    g[++idx] = {v, h[u]}, h[u] = idx;
}
void dfs(int u) {
    f[u][0] = 0, f[u][1] = 1;
    for (int i = h[u]; i; i = g[i].nx) {
        int v = g[i].v;
        dfs(v);
        f[u][0] += f[v][1];
        f[u][1] += min(f[v][0], f[v][1]);
    }
}
int main() {
    int n, u, v, k;
    while (~scanf("%d", &n)) {
        memset(h, 0, sizeof(h)), idx = 0, memset(st, 0, sizeof(st));
        for (int i = 1; i <= n; i++) {
            scanf("%d:(%d)", &u, &k);
            while (k--)
                scanf("%d", &v), add(u, v), st[v] = 1;
        }
        int rt = 0;
        while (st[rt]) rt++;
        dfs(rt);
        printf("%d\n", min(f[rt][0], f[rt][1]));
    }

    return 0;
}

标签:rt,覆盖,min,int,不选,Strategic,game,POJ,include
From: https://www.cnblogs.com/hellohebin/p/17715534.html

相关文章

  • 【POJ 3278】Catch That Cow 题解(深度优先搜索)
    农夫约翰已被告知一头逃亡奶牛的位置,并想立即抓住她。他从一条数字线上的N点(0≤N≤100000)开始,奶牛在同一条数字线上的K点(0≥K≤100000)。农夫约翰有两种交通方式:步行和坐车。*步行:FJ可以在一分钟内从任何点X移动到点X-1或X+1*坐车:FJ可以在一分钟内从任何X点移动到2×X点。如果奶......
  • Python游戏开发:Pygame库入门
    Pygame是一个开源的Python库,用于开发2D游戏。它提供了许多功能,如游戏开发、音频处理和事件处理。安装Pygame库您可以通过以下命令在终端中安装Pygame库:pipinstallpygame创建游戏窗口要创建一个游戏窗口,您可以使用以下代码:importpygamepygame.init()#设置窗口尺寸window_......
  • Roads in the North POJ - 2631 - 树的直径/树形dp
    题意:给出一棵无向树,求树的直径,即树上两点之间的最长距离分析:两种解法解法1:先任取一个点,找到距离该点最远的点u,再找到距离u最远的点v,那么u和v之间的路径就是一条直径。证明:只要找到了树的直径的一个端点,再从该点找到最远点就一定是直径的另一个端点。所以只需要证明第一次找到的......
  • [CF235D] Graph Game
    GraphGame乌克兰逃兵在线发题解。好像要用期望去推,但是像我这种看到序列的期望题只想得到线性性的弱鸡只能感理了。我们把点分治过程当成点分树,y能在x被爆时做贡献当且仅当y为x的子树。先考虑树的情况。考虑把遍历t的次数分到单个点上发现仅当x为x->y路径上......
  • Precomputed Radiance Transfer(games202)
    PrecomputedRadianceTransfer(games202)关于BRDF可以看看这篇文章基于物理着色:BRDF物体在不同光照下的表现不同,PRT(PrecomputedRadianceTransfer)是一个计算物体在不同光照下表现的方法。光线在一个环境中,会经历反射,折射,散射,甚至还会物体的内部进行散射。为了模拟具有真实......
  • 【POJ 2488】A Knight‘s Journey 题解(深度优先搜索)
    背景骑士厌倦了一次又一次地看到同样的黑白方块,决定去旅行全世界每当骑士移动时,它是一个方向上的两个正方形和一个垂直于这个方向的正方形。骑士的世界就是他生活的棋盘。我们的骑士生活在一个棋盘上,这个棋盘的面积比普通的8*8棋盘小,但它仍然是矩形的。你能帮助这位冒险的骑士制......
  • 【POJ 3275】Ranking the Cows 题解(传递闭包)
    农夫约翰的N头奶牛(1≤N≤1000)产奶率各不相同,FJ希望根据这些比率从最快的奶牛到最慢的奶牛订购奶牛。FJ已经比较了M(1≤M≤10000)对奶牛的产奶率。他想列出另外C对奶牛的列表,这样,如果他现在比较这些C对奶牛,他肯定能够推断出所有N头牛的正确顺序。请帮助他确定C的最小值,这样的列表是可......
  • POJ 2935 Basic Wall Maze BFS
    注意墙的处理,我是这么做的,把每个方块不能行走的方向标记出来,剩他的就是传统BFS了。#include<stdio.h>#include<queue>usingnamespacestd;intsx,sy,ex,ey;inth[4]={1,-1,0,0};intg[4]={0,0,1,-1};intdir[8][8][5];boolvisit[7][7];structpoint{ intx; inty; in......
  • poj 2528 Mayor's posters 线段树+离散化
    离散化处理要注意+1(看了HH大牛的博客懂的,以前自己的代码是不对的)例如数据:1311013610这样,普通离散化处理 {13610},然后此程序会操作成点染色,于是结果为2,但正确答案为3;HH大牛给出一种离散化方法:     如果相邻数字间距大于1的话,在其中加上任意一个数字,比如加......
  • POJ 2823 Sliding Window 单调队列
    这道题就是用单调队列来维护,但是用G++交TLE,用c++5000多ms,真是囧...代码很丑,就凑合着看吧#include<stdio.h>inta[1000009],que[1000009];intmain(){ intn,k,i,head,tail,flag=1,f; scanf("%d%d",&n,&k); for(i=1;i<=n;i++) scanf("%d",&a[i]); head=......