首页 > 其他分享 >AcWing. 323. 战略游戏

AcWing. 323. 战略游戏

时间:2023-01-18 18:12:45浏览次数:42  
标签:游戏 idx int son 323 while root 节点 AcWing

题意简述

\(\qquad\) 给定一棵树,要求树中任意一边至少选中一点,求最少满足题意的选点数

解题思路

\(\qquad\)我们可以先画出示意图来
GR.png
橙色点表示选,灰色点表示不选。
\(\qquad\)我们可以用 \(f[i][j], j\in [0,1]\) 来表示目前在考虑第i个点,选择情况是j,当 \(j = 0\)代表不选第 \(i\) 个点,当 \(j = 1\) 代表要选。
\(\qquad\)容易得出状态转移方程:对于父节点 \(fa\) ,子节点 \(son\), 当父节点不选的时候,由于一条边至少选一点,子节点必须选,所以 \(f[fa][0]\) 只能从 \(f[son][1]\) 转移,而父节点要选的时候,不论选不选子节点都可以符合题目要求,所以有两种转移方式

代码

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1550;
int h[N], e[N], ne[N], idx;
int f[N][2], is_son[N], n;

void add(int a, int b) 
{
    e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}

void dfs(int u) 
{
    f[u][0] = 0, f[u][1] = 1;
    for (int i = h[u]; ~i; i = ne[i]) 
    {
        int j = e[i];
        dfs(j);
        f[u][0] += f[j][1];
        f[u][1] += min(f[j][0], f[j][1]);
    }
}

int main() 
{
    while (~scanf("%d", &n)) 
    {
        memset(is_son, 0, sizeof is_son);
        memset(h, -1, sizeof h), idx = 0;

        while (n -- )
        {
            int u, son, sum;
            scanf("%d:(%d) ", &u, &sum);
            while (sum -- ) 
            {
                scanf("%d", &son);
                add(u, son);
                is_son[son] = true;
            }
        }

        int root = 0;
        while (is_son[root]) root ++ ;
        dfs(root);
        printf("%d\n", min(f[root][1], f[root][0]));
    }

    return 0;
}

标签:游戏,idx,int,son,323,while,root,节点,AcWing
From: https://www.cnblogs.com/StkOvflow/p/17060348.html

相关文章

  • 猜数游戏
    代码示例:importrandom classGame:#进入首次游戏的时候的菜单提示defindex_tip(self):print("***********欢迎来到猜数游戏*********") defindex_pa......
  • 峰值21WQps、亿级DAU,小游戏《羊了个羊》是怎么架构的?
    文章很长,而且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面......
  • 三子棋小游戏
    今天实现一个三子棋小游戏,虽然小,但是“麻雀虽小,五脏俱全”,通过三子棋游戏,我们来学习如何模块化地写代码。首先,我们创建一个game.h头文件,再创建一个game.c和test.c源文件。//......
  • 使用Hook拦截sendto函数解决虚拟局域网部分游戏联机找不到房间的问题——以文明6为例
    正文本文代码及编译好的二进制文件可以在下面这个仓库找到。https://gitcode.net/PeaZomboss/miscellaneous源代码在文件夹230113-civ6hooksendto若要下载二进制,请到ht......
  • AcWing1075. 数字转换
    题目描述如果一个数\(x\)的约数之和\(y\)(不包括他本身)比他本身小,那么\(x\)可以变成\(y\),\(y\)也可以变成\(x\)例如,\(4\)可以变为\(3\),\(1\)可以变为\(7\)。......
  • AcWing. 1073 树的中心
    题目描述给定一棵树,树中包含\(n\)个结点(编号\(1\)~\(n\))和\(n-1\)条无向边,每条边都有一个权值。请你在树中找到一个点,使得该点到树中其他结点的最远距离最近。解题......
  • 为什么你的游戏角色总是能穿墙
    本文首发于微信公众号【小蚂蚁教你做游戏】,欢迎关注领取更多学习做游戏的原创教程资料,每天学点儿游戏开发知识。嗨!大家好,我是小蚂蚁。在微信小游戏制作工具中,关于物理行为和......
  • luogu P7323 [WC2021] 括号路径
    题面传送门为了方便,我们仅保留\((v,u,-w)\)的反向边。可以发现,如果某个点\(u\)到\(v_1,v_2\)同时有相同边权的边,那么\((v_1,v_2)\)就是一个合法的点对。因此可以这样暴力......
  • 【补档】15 Jan 2293. 极大极小游戏(每日一题)
    15Jan2293.极大极小游戏给你一个下标从0开始的整数数组nums,其长度是2的幂。对nums执行下述算法:设n等于nums的长度,如果n==1,终止算法过程。否则,创建......
  • 用Three.js写h5小游戏-3d飞机大战
    用Three.js写h5小游戏-飞机大战​​博主的话​​​​运行图片​​​​目录路径!​​index.html​​博主的话Three.js是js的一个3D引擎,比较复杂。比如光是Three.js就附带了10......