Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

两段代码为何一个WA,一个AC?

Posted by dut200901102 at 2010-05-27 13:29:21 on Problem 1988 and last updated at 2010-05-27 13:30:09
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int MAXN=30010;

int p[MAXN],num[MAXN],c[MAXN];

void make_set()
{
    for(int i=1;i<=MAXN;++i)
    {
        p[i]=i;
        num[i]=1;
        c[i]=0;
    }
}

int find_set(int x)
{
    if(p[x]!=x)
    {
        int px=p[x];
        p[x]=find_set(p[x]);//就在这个位置,修改一下就AC了 ,但是逻辑上没有任何差别阿
        c[x]+=c[px];
    }
    return p[x];
}

void union_set(int a,int b)
{
    int x=find_set(a);
    int y=find_set(b);
    if(x==y)
    {
        return ;
    }
    p[y]=x;
    c[y]+=num[x];
    num[x]+=num[y];
}

int main()
{
    freopen("in.txt","r",stdin);
    char ch;
    int p,a,b;
    scanf("%d",&p);
    make_set();
    while(p--)
    {
        while(scanf("%c", &ch))
        {
            if(ch!='\n'&&ch!=' ')
            break;
        }
        if(ch=='M')
        {
            scanf("%d%d",&a,&b);
            union_set(a,b);
            continue;
        }
        if(ch=='C')
        {
            scanf("%d",&a);
            b=find_set(a);
            printf("%d\n",num[b]-c[a]-1);
        }
    }
    return 0;
}
————————————————————————————————————————
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int MAXN=30010;

int p[MAXN],num[MAXN],c[MAXN];

void make_set()
{
    for(int i=1;i<=MAXN;++i)
    {
        p[i]=i;
        num[i]=1;
        c[i]=0;
    }
}

int find_set(int x)
{
    if(p[x]!=x)
    {
        c[x]+=c[p[x]];
        p[x]=find_set(p[x]);
    }
    return p[x];
}

void union_set(int a,int b)
{
    int x=find_set(a);
    int y=find_set(b);
    if(x==y)
    {
        return ;
    }
    p[y]=x;
    c[y]+=num[x];
    num[x]+=num[y];
}

int main()
{
    freopen("in.txt","r",stdin);
    char ch;
    int p,a,b;
    scanf("%d",&p);
    make_set();
    while(p--)
    {
        while(scanf("%c", &ch))
        {
            if(ch!='\n'&&ch!=' ')
            break;
        }
        if(ch=='M')
        {
            scanf("%d%d",&a,&b);
            union_set(a,b);
            continue;
        }
        if(ch=='C')
        {
            scanf("%d",&a);
            b=find_set(a);
            printf("%d\n",num[b]-c[a]-1);
        }
    }
    return 0;
}
前面的AC了  后面的WA了    无语了  路过的大牛现身指点一下把

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator