zoukankan      html  css  js  c++  java
  • 洛谷P3367

    并查集模板。。。有些语句十分神奇,能够一句话完成一个操作。。

    其中gefa是压缩版(压代码。。),正常易懂的写法如下:

    int getfa(int x){

      if(x==fa[x]) return x;//如果这个点的祖先是自己的话,那么他就是根节点了~所以可以直接返回编号了

      else return getfa(fa[x]);//如果还是没有找到根节点的话,那么就让x的父亲去找他的父亲,直到找到根节点

    }

    如果你不会并查集算法的话,可以去网上搜一下。。。

    include<bits/stdc++.h>
    
    using namespace std;
    
    int n,m,z,x,y,fa[100010];
    
    int getfa(int x){return x==fa[x]?x:fa[x]=getfa(fa[x]);} //压缩版的getfather函数。。。
    
    int main(){
    
      scanf("%d%d",&n,&m);
    
      for(int i=1;i<=n;i++)fa[i]=i;// 初始所有点的father都是自己
    
      for(int i=1;i<=m;i++){
    
          scanf("%d%d%d",&z,&x,&y);
    
          if(z==1){fa[getfa(x)]=getfa(y);}//路径压缩,让以后其他点找祖先的时候,可以直接通过x点找到祖先,优化了很多复杂度
    
          else{
    
          if(getfa(x)==getfa(y)) puts("Y");//判断祖先相不相同,如果相同,则是同一集合内的,输出Y
    
          else puts("N");
    
          }
    
      }
    
      return 0;
    }
  • 相关阅读:
    洛谷——P2018 消息传递
    洛谷——P2827 蚯蚓
    洛谷——P1120 小木棍 [数据加强版]
    洛谷——P1168 中位数
    洛谷——P1850 换教室
    Kali-linux使用Metasploit基础
    Kali-linux使用Metasploitable操作系统
    Kali-linux使用OpenVAS
    Kali-linux使用Nessus
    Kali-linux绘制网络结构图
  • 原文地址:https://www.cnblogs.com/heqingyu/p/7682549.html
Copyright © 2011-2022 走看看