哪错了

P3367 【模板】并查集

zhmshitiancai @ 2016-10-30 14:43:42

#include<cstdio>
#include<iostream>
using namespace std;
int p[1000000+1];
void make(int x)
{
    p[x]=x;
}
int find(int x)
{
    if(x!=p[x]) find(p[x]);
    return p[x];
}
void union_set(int x,int y)
{
    x=find(x);
    y=find(y);
    p[x]=y;
}
int main()
{
    int n,m,zi,x,y;
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>zi>>x>>y;
        cout<<endl;
        if(zi==1)
        {
            if(p[x]==0)
                make(x);
            if(p[y]==0);
                make(y);
            union_set(x,y);
        }
        if(zi==2)
        {
            if(p[x]==0||p[y]==0)
                printf("N\n");
            else
            {
                if(find(x)==find(y)) 
                    printf("Y\n");
                else 
                    printf("N\n");
            }
        }
        for(int j=1;j<=4;j++)
            printf("%d",p[j]);
        cout<<endl;
    }
}

by Red_w1nE @ 2016-10-30 14:55:28

一点都不解释自己代码的意思就一股脑发过来 谁想看啊


by yang2016 @ 2016-11-04 21:39:08

提交前检查一下,自己测试的数据有没有删除。

错了两处:cin>>zi>>x>>y下面的换行符去掉

最后的 for(int j=1;j<=4;j++)

        printf("%d",p[j]);去掉

提交之前检查一下,自己测试一下


by yang2016 @ 2016-11-05 20:13:58

#include<cstdio>
#include<iostream>
using namespace std;
int p[1000000+1];
int find(int x)
{
    if(x==p[x])return x;
     p[x]=find(p[x]);
    return p[x];
}
int main()
{
    int n,m,zi,x,y;
    cin>>n>>m;
    for(int i=1;i<=n;i++) p[i]=i;
    for(int i=1;i<=m;i++)
    {
        cin>>zi>>x>>y;
        int xx=find(x);
        int yy=find(y);
        if(zi==1)
        if(xx!=yy)p[xx]=yy;
        if(zi==2)
        {
            if(p[xx]==p[yy])printf("Y\n");
            else printf("N\n");
        }
        //for(int j=1;j<=4;j++)cout<<p[j]<<' ';
    }
}

by yang2016 @ 2016-11-05 20:14:51

帮你改了一下,主要是没有初始化,还有合并时的find函数问题


|