E-小H学历史(牛客练习赛131)

题意:现有n座城池,有n-1条道路将这些城池连成树,每座城池可以被两个国家占领,或者是无主,每个国家可以占领和自己城池相连的城池。问两个国家总城池树差最小值是多少。

分析:bfs跑A可以占据的所有城池,遇到B停下,假设可以占据a个城池,dfs跑B可以占据的所有城池,遇到A停下,假设可以占据b个城池,那么A可以占据n-b到a个城池,B可以占据n-a到b个城池。已知范围,枚举两个国家离n/2相差最小的结果。

代码:

复制代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 10;
char a[N];
int vis[N];
vector<ll> edg[N];
int main()
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++){
        cin >> a[i];
    }
    for (int i = 1; i < n; i++){
        int x, y;
        cin >> x >> y;
        edg[x].push_back(y);
        edg[y].push_back(x);
    }
    queue<ll> q;
    for (int i = 1; i <= n; i++){
        if (a[i] == 'A')
        {
            q.push(i);
            vis[i] = 1;
        }
    }
    while (q.size()){
        ll u = q.front();
        q.pop();
        for (int v : edg[u]){
            if (a[v] == 'B'){
                continue;
            }
            if (vis[v]){
                continue;
            }
            q.push(v);
            vis[v] = 1;
        }
    }
    ll sumA = 0;
    for (int i = 1; i <= n; i++)
    {
        sumA += vis[i];
    }
    memset(vis, 0, sizeof(vis));
    for (int i = 1; i <= n; i++)
    {
        if (a[i] == 'B')
        {
            q.push(i);
            vis[i] = 1;
        }
    }
    while (q.size()){
        int u = q.front();
        q.pop();
        for (int v : edg[u]){
            if (a[v] == 'A'){
                continue;
            }
            if (vis[v]){
                continue;
            }
            q.push(v);
            vis[v] = 1;
        }
    }
    ll sumB = 0;
    for (int i = 1; i <= n; i++){
        sumB += vis[i];
    }
    ll ans = 1e18;
    for (ll i = 0; i <= n; i++){
        if (i <= sumA && n - i <= sumB){
            ans = min(ans, abs(i - (n - i)));
        }
    }
    cout << ans << endl;
    return 0;
}
相关推荐
sheeta19981 分钟前
LeetCode 补拙笔记 日期:2026.06.07 题目:283. 移动零
笔记·算法·leetcode
黎阳之光科技管控16 分钟前
纯视觉定位赋能海关口岸 无感通关提升国门安全与效率
算法·安全
晚风吹红霞25 分钟前
深入浅出 STL 之 map 与 set:从入门到实战
开发语言·c++
じ☆冷颜〃26 分钟前
Picard–Lindelöf定理在CS中的应用:理论框架与算法基础
人工智能·经验分享·笔记·算法·机器学习
牛油果子哥q29 分钟前
【C++封装】C++封装思想与访问权限终极精讲:public/private/protected权限解析、类封装设计、继承权限变化、工程私有化规范与面试坑点
c++·面试
织梦旅途29 分钟前
C++ 第一课 从 Hello Word!立刻开始
c++
不知名的老吴31 分钟前
机器学习评价之基础指标
人工智能·算法·机器学习
Felven31 分钟前
D. Divisible Pairs
算法
源代码杀手32 分钟前
基于ROS2+Gazebo+RIVE的40项计算机视觉前沿机器人项目(含视觉算法原理与源码获取方式)
算法·计算机视觉·机器人
.千余32 分钟前
【C++】 String 常用操作:增删查改 | 查找 | 截取 | IO
java·服务器·开发语言·c++·笔记·学习