6

来源:互联网 发布:ipad5怎么下载软件 编辑:程序博客网 时间:2024/06/11 22:03

昨天的报告今天才写……

hdu 1325.判断是不是一棵树,自己想法总是超时。

思路是定义结构体,下标作为儿子,结构体里面存父亲和有没有父亲。

开始每个儿子的父亲是自己,都没有父亲。

输入全部数据,输入过程中如果数据中有自己是自己、前者祖先等于后者祖先(其实包含自己是自己,隐隐约约觉得这步有问题)、后者已经有父亲了,都不是树;

将每个儿子的父亲改为祖先,类似并查集的“查”。

如果有两个祖先,不是树。

今天早上用并查集A了。

代码见下,先是并查集,后是错码。

#include<stdio.h>
#define N 10000
struct tree
{
    int parent;
    int have;
};
struct tree x[N];
int c[N];
int find(int n)
{
    if(x[n].parent==n)
    {
        return n;
    }
    else
        return find(x[n].parent);
}
void uni(int e,int w)
{
    int o,p;
    o=find(e);
    p=find(w);
    x[p].parent=o;
}
int main()
{
    int m,n,flag,i,k=0,d;
    while(1)
    {
        for(i=0;i<N;i++)
        {
            x[i].parent=i;
            x[i].have=0;
            c[i]=0;
        }
        flag=1;
        while(1)
        {
            scanf("%d %d",&m,&n);
            if(m<0)
                return 0;
            if(m==n)
            {
                if(m==0)
                {
                    k++;
                    break;
                }
                else
                {
                    flag=0;
                }
            }
            else
            {
                if(x[n].have==0&&(find(m)!=find(n)))
                {
                    uni(m,n);
                    x[n].have=1;
                }
                else
                {
                    flag=0;
                }
            }
        }
        d=0;
        for(i=1;i<N;i++)
        {
            if(x[i].have==1)
            {
                c[(x[i].parent)]=1;
            }
        }
        for(i=1;i<N;i++)
        {
            d=d+c[i];
        }
        if(flag==1&&d==1)
        {
            printf("Case %d is a tree.\n",k);
        }
        else
        {
            printf("Case %d is not a tree.\n",k);
        }
    }
}


#include<stdio.h>
#define N 100000
struct tree
{
    int father;
    int visit;
};
struct tree son[N];
int sum[N];
int find(int i)
{
    if(son[i].father==i)
        return i;
    else
        return find(son[i].father);
}
int main()
{
    int i,a,b,flag,k=0;
    while(scanf("%d %d",&a,&b)!=EOF&&(a>=0&&b>=0))
    {
        for(i=0;i<N;i++)
        {
            sum[i]=0;
            son[i].father=i;
            son[i].visit=0;
        }
        son[b].father=a;
        son[b].visit=1;
        flag=0;
        if(a==b)
            flag=1;
        do
        {
            scanf("%d %d",&a,&b);
            if(a==b)
            {
                if(a==0)
                    break;
                else
                    flag=1;
            }
            else
            {
                if(son[b].visit==1||find(a)==find(b))
                {
                    flag=1;
                }
                son[b].father=a;
                son[b].visit=1;
            }
        }while(1);
        k++;
        if(flag==1)
        {
            printf("Case %d is not a tree.\n",k);
        }
        else
        {
            for(i=1;i<N;i++)
            {
                if(son[i].visit==1)
                {
                    son[i].father=find(i);
                    sum[son[i].father]=1;
                }
            }
            for(i=1;i<N;i++)
            {
                flag+=sum[i];
            }
            if(flag==1)
                printf("Case %d is a tree.\n",k);
            else
                printf("Case %d is not a tree.\n",k);
        }


    }
    return 0;
}

0 0