并查集模板。。。有些语句十分神奇,能够一句话完成一个操作。。
其中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; }