首页 > 其他分享 >E-小H学历史(牛客练习赛131)

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

时间:2024-11-04 21:51:33浏览次数:3  
标签:城池 练习赛 edg int 可以 占据 cin 牛客 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;
}

标签:城池,练习赛,edg,int,可以,占据,cin,牛客,131
From: https://blog.csdn.net/m0_74310050/article/details/143495100

相关文章

  • 牛客软件开发专项练习-Day6
    1.若一个具有N个结点,M条边的无向图构成一个森林,(N>M),则该森林必有多少棵树(N-M)2.某网络的IP地址空间为192.168.5.0/24 , 采用定长子网划分,子网掩码为255.255.255.248,则该网络的最大子网个数 、每个子网内的最大可分配地址个数(32,6)解释:由192.168.5.0/24可知子网掩码是255.......
  • 算法|牛客网华为机试31-40C++
    牛客网华为机试上篇:算法|牛客网华为机试21-30C++文章目录HJ31单词倒排HJ32密码截取HJ33整数与IP地址间的转换HJ34图片整理HJ35蛇形矩阵HJ36字符串加密HJ37统计每个月兔子的总数HJ38求小球落地5次后所经历的路程和第5次反弹的高度HJ39判断两个IP是否属于同一子......
  • 牛客周赛 Round 66 题解
    牛客周赛Round66题解牛客周赛Round66A-小苯吃糖果_牛客周赛Round66#include<bits/stdc++.h>#defineendl'\n'usingnamespacestd;inta[5];voidsolve(){ for(inti=1;i<=3;i++)cin>>a[i]; sort(a+1,a+4); intans=max(a[1]+a[2],a[3]); cout<......
  • 2024-2025-1 20241318《计算机基础与程序设计》第六周学习总结
    这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK06这个作业的目标<Polya如何解决问题简单类型与组合类型复合数据结构查找与排序算法算法复杂度......
  • 2024-2025-1 20241314《计算机基础与程序设计》第六周学习总结
    学期(如2024-2025-1)20241314《计算机基础与程序设计》第六周学习总结作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计这个作业要求在哪里2024-2025-1计算机基础与程序设计第六周作业这个作业的目标Polya如何解决问题简单类型与组合类型复合数据......
  • 2024-2025-1 20241312《计算机基础与程序设计》第6周学习总结
    这个作业属于哪个课程<班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2024-2025-1计算机基础与程序设计第六周作业)这个作业的目标Polya如何解决问题简单类型与组合类型复合数据结构查找与排序算法算法复杂度递归代码......