求助10分

P3367 【模板】并查集

御·Dragon @ 2018-07-22 10:21:39

桃 @萝莉大法好 @AThousandSuns

改了一下,再次求助

#include<bits/stdc++.h>
using namespace std;
const int MAXN=20010;
int s[MAXN];
int n,m,z,x,y,k;
int fin(int p){
    if(s[p]==0)return p;
    fin(s[p]);
}
int main(){
    cin>>n>>m; 
    for(int i=1;i<=m;i++){
        scanf("%d",&z);
        scanf("%d %d",&x,&y);
        switch(z){
            case 1:{
                s[y]=x;
                break;
            }
            case 2:{ 
                if(fin(y)==fin(x))printf("Y\n");
                else printf("N\n");
            }
        }
    }
    return 0;
}
//样例过了,但10分

by UKE自动稽 @ 2018-07-22 10:34:50

我好像节选错了,


by 御·Dragon @ 2018-07-22 10:35:57

@UKE自动机 666,你和我教练的标程中的是一样的。但他的是findF


by Altria_Pendragon_ @ 2018-07-22 10:37:20

@封禁用户名f8617dda

1.集合的初始状态father[x]=x;

2.您的路径压缩呢?


by 御·Dragon @ 2018-07-22 18:17:26

@Rousseau_ @CONILLION @UKE自动机

现在谢谢,各位大佬,本人已经AC,然而程序的经历如下:

#include<bits/stdc++.h>//万能头 
using namespace std;
const int MAXN=200010;
int s[MAXN];
int n,m,z,x,y,k;
int fin(int p){
    if(s[p] == p) {
        return p;//若果相同的话就是根,返回 
    }
    fin (s[p]);
    s[p]=fin (s[p]); //要一边返回一边路径压缩。 
    return fin (s[p]);
}
int main(){
    cin>> n>> m; //输入 
    for(int i = 1;i <= m;i ++){
        s[i] = i;//如果这里不加的话前面fin的第一的判断 if(s[p] == 0)
    }
    for(int i = 1;i <= m;i ++){
        /*要边输入边执行*/ 
        scanf("%d", &z);
        scanf("%d %d", &x, &y);
        switch (z){//最好用开关语句,更快 
            case 1:{
                s[fin(y)] = fin(x);//千万不能 s[y] =x!!!!!切记!千万不能! 
                break;
            }
            case 2:{ 
                if(fin(y) == fin(x)){//不可以y==k,上面已经讲了。 
                    printf("Y\n");
                }else{
                    printf("N\n");  
                } 
            }
        }
    }
    return 0;
}

上一页 |