传送门

大致题意 : 一个n个点m条边的无重边无自环的有向图, 初始均为白点, 若某个点的前驱节点均为黑点, 则该点可以被染黑, 初始可任意染黑一点, 求最大化图中黑点的数量

思路 : 首先可以画一张图, 如样例, 起始我们染黑1, 后续2, 3可被染黑, 不难发现, 1,2,3可以互相影响, 染黑3 不如 染黑2, 染黑2 不如 染黑 1, 这时我们可以将这三个点看做一个点, 即进行合并, 可以发现合并后并不会对原图产生影响, 如节点 5 在合并和 由{1, 2, 3} 和 {4} 控制并不能染黑, 若有另一点能到{1, 2, 3}, 则{1, 2, 3}并不能合并, 可知合并后的{1, 2, 3}的前后节点不受影响, 即当前合并后的节点集合的节点数即为最大, 若有多个集合取极大值即可

显然暴力是会超时的, 因为会遍历到所有重边来进行合并, 这里可以想到用启发式合并来进行操作, 对于两个可以连接的集合, 我们只遍历出边数小的那个集合, 将它与出边大的合并, 来优化时间复杂度, 最坏情况下m条边, 分为m/2, m/2两个集合, 每次只遍历一个, 不断向下合并, 复杂度为 O(m/2 * log m), 再加上需要用到set操作, 总时间复杂度为O(m/2 * log m * log m), 是可以做的

代码如下: 

#include <bits/stdc++.h>using namespace std;stringstream ss;
#define endl "\n"
typedef long long ll;
typedef pair<int, int> PII;
const int N = 2e5+10, M = 30, mod = 1e9+7;
const int INF = 0x3f3f3f3f;int n;
int p[N], sz[N]; // p为并查集集合, sz为集合大小
set<int> pre[N], ne[N]; // 分别记录前驱节点和后缀节点int find(int x)
{if(x != p[x]) p[x] = find(p[x]);return p[x];
}void merge(int x, int y) // 启发式合并
{x = find(x), y = find(y);if(x == y) return;if(ne[x].size() < ne[y].size()) swap(x, y); // 保证x是出边大的那个p[y] = x, sz[x] += sz[y]; // 将y向x合并vector<PII> seg; // 合并一边x,y后, 对于{x, y}和其他点 可能还能继续合并, 用seg保存起来, dfs合并for(auto t : ne[y]){pre[t].insert(x), ne[x].insert(t), pre[t].erase(y); // 合并操作if(pre[t].size() == 1) seg.push_back({t, x});}for(auto t : seg) merge(t.first, t.second); // 继续合并
}void solve(int t)
{cin>>n;for(int i = 1; i<=n; i++) p[i] = i, sz[i] = 1, pre[i].clear(), ne[i].clear();for(int i = 1; i<=n; i++){int k;cin>>k;for(int j = 1; j<=k; j++){int x;cin>>x;ne[x].insert(i);pre[i].insert(x);}}for(int i = 1; i<=n; i++){if(pre[i].size() == 1) merge(*pre[i].begin(), i); // 对入边为1的点与当前点进行合并}int res = 0;for(int i = 1; i<=n; i++) res = max(res, sz[i]);cout<<"Case #"<<t<<": "<<res<<endl;
}int main()
{ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
//    solve();int T;cin>>T;for(int i = 1; i<=T; i++){solve(i);}
}

22牛客多校1 J.Serval and Essay (启发式合并)相关推荐

  1. 22牛客多校day1 I - Chiitoitsu 概论dp

    I - Chiitoitsu 题目背景 Serval is learning Japanese Mahjong recently in order to play Mahjong Soul with ...

  2. 2021牛客多校1——J:Journey of Railway Stations(线段树)

    题面 题意: 一段路上有 N N N​​​​ 个火车站,每个火车站有一个合法时间段 [ u i , v i ] [u_i, v_i] [ui​,vi​]​​​​​,相邻两个火车站有一个长度 c o s ...

  3. 图论 ---- Tajran找割点 牛客多校2021 J Defend Your Country

    解题思路: 首先我们知道对于点数为偶数的联通块是不用管的 对于奇数个连通块里面的点: 点分两种: 普通的点:对于奇数个点的连通块,删除一个普通点就很好了.那么就是删除那个权值最小的普通点就可以了 割点 ...

  4. 牛客练习赛63 F.牛牛的树行棋(启发式合并+sg打表)

    LINK 假设只有一枚棋子,那么这枚棋子在叶子节点的 s g sg sg值显然是零 其他节点可以 s g sg sg打表推出来,由于只需要子树内的 s g sg sg值,似乎需要用到启发式合并计算 但 ...

  5. 牛客多校三 B Black and white

    牛客多校三 B Black and white 在n*m的棋盘上,每个格子有一个数,初始可以选一定的格子标记为黑色,在任意四个形如(i1, j1)(i1, j2)(i2, j1)(i2, j2)的格子 ...

  6. 2019牛客多校第一场

    2019牛客多校第一场 题号 题目 知识点 A Monotonic Matrix B Symmetric Matrix C Fluorescent 2 D Two Graphs E Removal F ...

  7. LCS(2021牛客多校4)

    LCS(2021牛客多校4) 题意: 让你构造三个字符串s1,s2,s3,长度均为n,要求LCS(s1,s2)=a,LCS(s2,s3)=b,LCS(s1,s3)=c 题解: 先考虑三个串互相LCS为 ...

  8. 24dian(牛客多校第三场)

    24dian(牛客多校第三场) 题意: 给你n张牌,每张牌的大小为1 ~ 13,问这些牌与加减乘除任意组合(可以使用括号),且但所有的有效解在计算过程中都涉及到分数,即非整数,能否组成答案m,如果可以 ...

  9. 2018年牛客多校算法寒假训练营练习比赛(第一场)C. 六子冲

    2018年牛客多校算法寒假训练营练习比赛(第一场)C. 六子冲 题目链接 做法:模拟即可 #include <bits/stdc++.h> #define P pair<int,in ...

  10. 2022牛客多校(十)

    2022牛客多校(十) 一.比赛小结 比赛链接:"蔚来杯"2022牛客暑期多校训练营10 二.题目分析及解法(基础题) F.Shannon Switching Game? 题目链接 ...

最新文章

  1. 东野圭吾最值得看的书排行榜_东野圭吾最值得看的7本作品,我进了坑就再也没出来...
  2. 15 个必须知道的 Chrome 开发工具技巧
  3. Java 循环队列原理与用法详解
  4. java过滤结果集方法_QueryRunner类结果集处理的八种方法
  5. Codeforces 1110 简要题解
  6. JAVA——Okhttp封装工具类
  7. python中的单下划线和双下划线_python 里面的单下划线与双下划线的区别(私有和保护)...
  8. 停止预览时调用Camera.release(), 出现Method called after release()异常问题原因及解决办法...
  9. JUC之volatile
  10. 5.录制与回放终端会话.
  11. 【Arduino】步进电机驱动程序Stepper_Motor_TB6600
  12. excel2019批量删除空白行的方法
  13. ElasticSearch六 ElasticSearch扩展之FileBeat、Logstash
  14. PHP基础+php高级+前端+项目实战视频教程免费分享
  15. sklearn机器学习笔记:数据预处理与特征工程
  16. mysql怎么截取时分秒_mysql获取表中日期的年月日时分秒
  17. win7系统 将 IE11 改为 IE8
  18. 二本逆袭进百度,我总结了这些经验
  19. MySQL数据库迁移详细步骤
  20. DBCO-Chondroitin DBCO-软骨素

热门文章

  1. 跟着《SpringInAction》学Spring——入门篇
  2. Python enumerate,iter的用法
  3. Entry name ‘assets/app.js‘ collided
  4. 《2021政府工作报告》词云图一览
  5. 信诺科学计算机说明书,计算机科学技术专业简介(Introduction to computer science and technology).doc...
  6. 查询大数据各组件版本
  7. 氢键H-H的博客目录
  8. 073_SFDC Limit
  9. java计算机毕业设计共享充电宝管理系统源码+mysql数据库+系统+lw文档+部署
  10. 曾经沧海难为水,除却巫山不是云。