题解 | 树上行走

树上行走

https://www.nowcoder.com/practice/0516ea09ce3540dd9f23fbf6f9ab4754

手搓一个DSU的板子,根据题意合并类型相同的点,最后找到并查集中集合的最大siz,满足最大siz的都放进答案数组中,最后输出答案数组的大小和内容即可。

#include <iostream>
#include <vector>
#include <numeric>

struct DSU{
  std::vector<int> f, siz;

  DSU(int n){
    f.resize(n + 1);
    std::iota(f.begin(), f.end(), 0);
    siz.assign(n + 1, 1);
  }

  int find(int x){
    if(x != f[x]){
      f[x] = find(f[x]);
    }
    return f[x];
  }

  bool same(int u, int v){
    return find(u) == find(v);
  }

  bool merge(int u, int v){
    int fu = find(u);
    int fv = find(v);
    if(fu == fv){
      return false;
    }
    f[fv] = fu;
    siz[fu] += siz[fv];
    return true;
  }
};

int main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  std::cout.tie(nullptr);

  int n;
  std::cin >> n;

  std::vector<int> a(n + 1);
  for(int i = 1; i <= n; i++){
    std::cin >> a[i];
  }

  DSU dsu(n);
  for(int i = 1; i < n; i++){
    int u, v;
    std::cin >> u >> v;

    if(a[u] == a[v]){
      dsu.merge(u, v);
    }
  }

  int maxsiz = 0;
  for(int i = 1; i <= n; i++){
    maxsiz = std::max(maxsiz, dsu.siz[dsu.find(i)];
  }

  std::vector<int> ans;
  for(int i = 1; i <= n; i++){
    if(dsu.siz[dsu.find(i)] == maxsiz){
      ans.push_back(i);
    }
  }

  std::cout << ans.size() << "\n";
  for(int i = 0; i < ans.size(); i++){
    std::cout << ans[i] << " \n"[i + 1 == ans.size()];
  }

  return 0;
}

全部评论

相关推荐

04-02 10:09
门头沟学院 Java
用微笑面对困难:这里面问题还是很多的,我也不清楚为啥大家会感觉没啥问题。首先就是全栈开发实习9个月的内容都没有java实习生的内容多,1整个技术栈没看出太核心和难点的内容,感觉好像被拉过去打杂了,而且全栈基本上很容易被毙。里面能问的bug是在太多了比如L:继承 BaseMapper 可直接使用内置方法’。请问你的 BaseMapper 是如何扫描实体类注解如果瞬时产生 100 个上传任务,MySQL 的索引设计是否会有瓶颈?你做过分库分表或者索引优化吗?全栈的内容可以针对动态难点去搞,技能特长写在下面吧,你写了这么多技能,项目和实习体现了多少?你可以在项目里多做文章然后把这个放下去,从大致来看实习不算太水,有含金量你也要写上内容针对哨兵里面的节点变化能问出一万个问题,这个很容易就爆了。
提前批简历挂麻了怎么办
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务