• 题意:有\(n\)个点,\(n-1\)条边,每个点的类型是\(0\)或\(1\),现在让你选一个点,然后所有与该点类型不同的点直接消失,问选哪些点之后,该点所在的联通块最大.

  • 题解:

    1. 因为选完之后两个类型不同的点之间的边会消失,所以我们可以直接维护一个并查集,每个集合中存的是相同类型的点的连通数量,维护最大值即可.
    2. 这题也可以用dfs来写,我们可以直接在dfs求连通块的同时用动态数组记录这个连通块中每个点的下标,然后去维护数组长度的最大值,模拟一下,具体细节看代码吧.
  • 代码:

    1. dsu:

      int n;
      int a[N];
      int cnt[N];
      int p[N];
      vector<int> ans; int find(int x){
      if(p[x]!=x) p[x]=find(p[x]);
      return p[x];
      } int main() {
      //ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
      n=read();
      for(int i=1;i<=n;++i){
      a[i]=read();
      cnt[i]=1;
      p[i]=i;
      } for(int i=1;i<n;++i){
      int u,v;
      u=read(),v=read();
      if(a[u]==a[v]){
      int fu=find(u);
      int fv=find(v);
      if(fu!=fv){
      p[fu]=fv;
      cnt[fv]+=cnt[fu];
      }
      }
      } int res=0;
      for(int i=1;i<=n;++i){
      int fa=find(i);
      res=max(res,cnt[fa]);
      }
      for(int i=1;i<=n;++i){
      if(cnt[find(i)]==res) ans.pb(i);
      }
      printf("%d\n",ans.size());
      for(auto w:ans) printf("%d ",w); return 0;
      }
    2. dfs:

      int n;
      int val[N];
      vector<int> v[N],s[N];
      vector<int> all,res;
      int cnt;
      bool st[N]; void dfs(int u,int t){
      s[t].pb(u);
      for(auto w:v[u]){
      if(!st[w] && val[w]==val[u]){
      st[w]=true;
      dfs(w,t);
      }
      }
      } int main() {
      ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
      cin>>n;
      for(int i=1;i<=n;++i){
      cin>>val[i];
      }
      for(int i=1;i<n;++i){
      int a,b;
      cin>>a>>b;
      v[a].pb(b);
      v[b].pb(a);
      } for(int i=1;i<=n;++i){
      if(!st[i]){
      st[i]=true;
      dfs(i,cnt);
      cnt++;
      }
      }
      int mx=0;
      int cur=0;
      for(int i=0;i<cnt;++i){
      if(s[i].size()>mx){
      all.clear();
      mx=s[i].size();
      cur=mx;
      all.pb(i);
      }
      else if(s[i].size()==mx){
      all.pb(i);
      cur+=mx;
      }
      }
      for(auto w:all){
      for(int j=0;j<s[w].size();++j){
      res.pb(s[w][j]);
      }
      }
      sort(res.begin(),res.end());
      cout<<cur<<endl;
      for(auto w:res) cout<<w<<" "; return 0;
      }

牛客小白月赛28 J.树上行走 (并查集,dfs)的更多相关文章

  1. 牛客小白月赛6 J 洋灰三角 数学

    链接:https://www.nowcoder.com/acm/contest/136/J来源:牛客网 题目描述     洋灰是一种建筑材料,常用来筑桥搭建高层建筑,又称,水泥.混凝土.     WH ...

  2. 牛客小白月赛2 J 美 【构造】

    链接:https://www.nowcoder.com/acm/contest/86/J来源:牛客网 题目描述 最后,Sεlιнα(Selina) 开始了选美大赛. 一如既往地,Sεlιнα 想最大化 ...

  3. 牛客网 牛客小白月赛1 J.おみやげをまらいました

    J.おみやげをまらいました   链接:https://www.nowcoder.com/acm/contest/85/J来源:牛客网     随便写写.   代码: 1 #include<ios ...

  4. 牛客小白月赛4 J 强迫症 思维

    链接:https://www.nowcoder.com/acm/contest/134/J来源:牛客网 题目描述 铁子最近犯上了强迫症,他总是想要把一个序列里的元素变得两两不同,而他每次可以执行一个这 ...

  5. 牛客小白月赛12 J 月月查华华的手机 (序列自动机模板题)

    链接:https://ac.nowcoder.com/acm/contest/392/J 来源:牛客网 题目描述 月月和华华一起去吃饭了.期间华华有事出去了一会儿,没有带手机.月月出于人类最单纯的好奇 ...

  6. 牛客练习赛16 C 任意点【并查集/DFS/建图模型】

    链接:https://www.nowcoder.com/acm/contest/84/C 来源:牛客网 题目描述 平面上有若干个点,从每个点出发,你可以往东南西北任意方向走,直到碰到另一个点,然后才可 ...

  7. 牛客小白月赛12 J 月月查华华的手机(序列自动机)

    ---恢复内容开始--- 题目来源:https://ac.nowcoder.com/acm/contest/392/J 题意: 题目描述 月月和华华一起去吃饭了.期间华华有事出去了一会儿,没有带手机. ...

  8. 牛客小白月赛1 J おみやげをまらいました 【MAP】

    链接:https://www.nowcoder.com/acm/contest/85/J おみやげをまらいました!    蛙蛙还是给你带来了礼物.但它有个小小的要求,那就是你得在石头剪刀布上赢过它才能 ...

  9. 牛客小白月赛30 J.小游戏 (DP)

    题意:给你一组数,每次可以选择拿走第\(i\)个数,得到\(a[i]\)的分数,然后对于分数值为\(a[i]-1\)和\(a[i]+1\)的值就会变得不可取,问能得到的最大分数是多少. 题解:\(a[ ...

随机推荐

  1. 【Java】集合框架(List Set Map)

    文章目录 集合框架 List(列表) ArrayList 案例 Set HashSet 案例 iterator(迭代器) Map HashMap 案例 集合总结 参考资料 重新搞一波 复习巩固 简单记 ...

  2. 分别使用 Python 和 Math.Net 调用优化算法

    1. Rosenbrock 函数 在数学最优化中,Rosenbrock 函数是一个用来测试最优化算法性能的非凸函数,由Howard Harry Rosenbrock 在 1960 年提出 .也称为 R ...

  3. 使用 gRPCurl 调试.NET 5的gPRC服务

    介绍 你用过 Curl 吗?这个工具允许你通过 http 来发送数据,现在有一个适用于gGRPC的工具,gRPCurl,在本文中,我将介绍如何下载安装这个工具,然后通过这个工具调试我们.NET 5上面 ...

  4. 【Azure Developer】解决Azure Key Vault管理Storage的示例代码在中国区Azure遇见的各种认证/授权问题 - C# Example Code

    问题描述 使用Azure密钥保管库(Key Vault)来托管存储账号(Storage Account)密钥的示例中,从Github中下载的示例代码在中国区Azure运行时候会遇见各种认证和授权问题, ...

  5. ctfhub技能树—文件上传—双写后缀

    双写后缀绕过 用于只将文件后缀名,例如"php"字符串过滤的场合: 例如:上传时将Burpsuite截获的数据包中文件名[evil.php]改为[evil.pphphp],那么过滤 ...

  6. 浅入深出了解XXE漏洞

    环境搭建 https://github.com/c0ny1/xxe-lab 为了更深入的理解,我准备理论和实际相结合的了解XXE! 浅谈XML 初识XML 一个好的代码基础能帮助你更好理解一类漏洞,所 ...

  7. 跨平台导PDF,结合wkhtmltopdf很顺手

    前言 好东西要分享,之前一直在使用wkhtmltopdf进行pdf文件的生成,常用的方式就是先安装wkhtmltopdf,然后在程序中用命令的方式将对应的html生成pdf文件,简单而且方便:但重复的 ...

  8. Poj-P2533题解【动态规划】

    本文为原创,转载请注明:http://www.cnblogs.com/kylewilson/ 题目出处: http://poj.org/problem?id=2533 题目描述: 如果ai1 < ...

  9. [Usaco2015 dec]Breed Counting

    原题链接https://www.lydsy.com/JudgeOnline/problem.php?id=4397 用线段树维护区间和即可.时间复杂度\(O((N+Q)logN)\). #includ ...

  10. 两个报文是如何进行 TCP 分组传输

    16 | 如何理解TCP的"流"? https://time.geekbang.org/column/article/132443 TCP 是一种流式协议在前面的章节中,我们讲的都 ...