洛谷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;
}
原文地址:https://www.cnblogs.com/heqingyu/p/7682549.html