Is It A Tree?------HDOJ杭电1325(两种方法,可以用也可以不用并查集!!!!!!详解)

Problem Description

A tree is a well-known data structure that is either empty (null, void, nothing) or is a set of one or more nodes connected by directed edges between nodes satisfying the following properties.

There is exactly one node, called the root, to which no directed edges point.

Every node except the root has exactly one edge pointing to it.

There is a unique sequence of directed edges from the root to each node.

For example, consider the illustrations below, in which nodes are represented by circles and edges are represented by lines with arrowheads. The first two of these are trees, but the last is not.

In this problem you will be given several descriptions of collections of nodes connected by directed edges. For each of these you are to determine if the collection satisfies the definition of a tree or not.

Input

The input will consist of a sequence of descriptions (test cases) followed by a pair of negative integers. Each test case will consist of a sequence of edge descriptions followed by a pair of zeroes Each edge description will consist of a pair of integers;
the first integer identifies the node from which the edge begins, and the second integer identifies the node to which the edge is directed. Node numbers will always be greater than zero.

Output

For each test case display the line ``Case k is a tree." or the line ``Case k is not a tree.", where k corresponds to the test case number (they are sequentially numbered starting with 1).

Sample Input

6 8 5 3 5 2 6 4
5 6 0 0
8 1 7 3 6 2 8 9 7 5
7 4 7 8 7 6 0 0
3 8 6 8 6 4
5 3 5 6 5 2 0 0
-1 -1

Sample Output

Case 1 is a tree.
Case 2 is a tree.
Case 3 is not a tree.

这道题乍一看!!!!!!并查集啊!!!!!!@¥%……@…………%¥……#¥%&……%&&%&#%……*&……¥@……&……%&#&……&¥#&&¥&%¥!!!!!!

此处省略六万六千六百六十六个字!!!!!!表达欣喜之情,并查集还是很简单的!!!!!!

对吧!!!!!!

如果对并查集不怎么熟悉的童鞋,咱们来小小介绍下某万能思想:找老大!!!!!!这里有一篇文章,讲的特别好,http://blog.csdn.net/shahongzhou/article/details/8957886,这是链接,大家可以看看!!!!!!

我先剧透一下,就是一级下面还有一级,咱们把他们归结为一个老大,就是b归a管,c归b管,咱们就让c直接归a管,直接找到根节点,嗯,剧透完毕!!!!!!

现在咱们来讲讲这道题,我相信会百度这道题的童鞋一般就两种情况,并查集不会的,还有这题一直WA的,哈哈哈哈哈哈哈哈哈哈!!!!!!23333333333333!!!!!!

笑笑有益身体健康!!!!!!

并查集不会的先去看看上面的链接的知识,然后做一下杭电的畅通工程!!!!!!不过那个畅通工程不一定都是并查集,知识有一题是,哪一题我忘了!!!!!!

这题就是说给一堆数据,一对一对的,ono!!!!!!今天520,讲这么伤心的东西,一对一对!!!!!!不好意思,又偏题了!!!!!!不过我等ACMER屌丝总是要伤感一下的!!!!!!求理解啊!!!!!!继续讲解题目,不停输入a,b,代表b是a的子节点,然后a,b都为0的时候输入结束!

这道题考虑的东西好多啊!!!!!!

坑爹有木有啊!!!!!!

WA的童鞋可以理解的!!!!!!

首先,不能成环!!!!!!

然后不能是树林!!!!!!

最后,不能有入度为2的节点!!!!!!

先贴下代码,大伙好好理解下,代码AC过的:

#include<stdio.h>
#define maxn 100000 + 6
int tree[maxn],bj[maxn];                      //数组e的元素值等于当前序号父级的序号,不一定是树的根
int find(int x)
{                                                            //找树根
    if(tree[x]==x)
        return x;
    else
        return find(tree[x]);
}

int main()
{
    int i,j,k;
    int t,n,m;
    int x,y,num;
    int w=0;
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        if(m<0&&n<0)
            break;
        t=0;
        w++;
        if(!(m||n))
            printf("Case %d is a tree.\n",w);
        else
        {
            for(i=1;i<=maxn;i++)
            {
                tree[i]=i;
                bj[i]=0;
            }
            tree[n]=m;
            bj[m]=bj[n]=1;
            while(scanf("%d%d",&m,&n)!=EOF&&(m||n))
            {
                x=find(m);
                y=find(n);
                if(x==y)
                    t=1;                                             //判断是否是环
                else
                    tree[n]=m;                                       //即使存在元素更改了父级也不影响树的个数
                bj[m]=bj[n]=1;
            }
            if(t==1)
                printf("Case %d is not a tree.\n",w);
            else
            {
                num=0;
                for(i=1;i<=maxn;i++)
                {
                    if(bj[i]==1&&tree[i]==i)                      //统计树根个数,为1时才符合题意
                    {
                        num++;
                        if(num>1)
                            break;
                    }
                }
                if(num>1)
                    printf("Case %d is not a tree.\n",w);
                else
                    printf("Case %d is a tree.\n",w);
            }
        }
    }
    return 0;
}

都说了是并查集的题目,所以并查集的做法先来一遍,现在小弟来种不需要并查集的方法!!!!!!

直接上代码!!!!!!同AC过的:

#include "stdio.h"
#include<iostream>
#define m 100001
using namespace std;
int main()
{
    int i,j,k;
    int a,b,flag;
    int tree[m];
    int v[m];
    int ans=1,flag2;
    while(cin>>a>>b)
    {
        if(a<0&&b<0)
            break;
        flag=0;
        flag2=0;
        memset(tree,0,m-1);
        memset(v,0,m-1);
        int e=0;
        while(a&&b)
        {
            flag2=1;
            if(!v[a])
            {
                v[a]=1;
                e++;
            }
            if(!v[b])
            {
                v[b]=1;
                e++;
            }
            e--;
            if(tree[b]==0)//b is root
                tree[b]=1;
            else
            {
                flag=1;
                break;
            }
            cin>>a>>b;
        }
        while(a&&b)
        {
            scanf("%d %d",&a,&b);
        }
        if((!flag&&e==1)||flag2==0)
            printf("Case %d is a tree.\n",ans);
        else
            printf("Case %d is not a tree.\n",ans);
        ans++;
    }
    return 0;
}

具体为什么???!!!自个儿理解去吧!!!!!!

好啦!!!!!!

卤煮不容易啊!!!!!!在这么伤感的日子(520)里还要写题解造福大伙,你们是不是觉得我好伟大!!!!!!O(∩_∩)O哈哈~

还是那句话,如果发现bug,还请指出,不胜感激,晚安啦!!!!!!

Is It A Tree?------HDOJ杭电1325(两种方法,可以用也可以不用并查集!!!!!!详解)

时间: 2024-10-10 05:29:38

Is It A Tree?------HDOJ杭电1325(两种方法,可以用也可以不用并查集!!!!!!详解)的相关文章

Bone Collector------HDOJ杭电2602(纯01背包问题!!!!!!详解!)

Problem Description Many years ago , in Teddy's hometown there was a man who was called "Bone Collector". This man like to collect varies of bones , such as dog's , cow's , also he went to the grave - The bone collector had a big bag with a volu

魔咒词典------HDOJ杭电1880(字符串的处理,很简单)

Problem Description 哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔咒,所以他需要你的帮助. 给你一部魔咒词典.当哈利听到一个魔咒时,你的程序必须告诉他那个魔咒的功能:当哈利需要某个功能但不知道该用什么魔咒时,你的程序要替他找到相应的魔咒.如果他要的魔咒不在词典中,就输出"what?" Input 首先列出词典中不超过100000条不同的魔咒词条,每条格式

Java生鲜电商平台-APP/小程序接口传输常见的加密算法及详解

说明:Java生鲜电商平台-APP/小程序接口传输常见的加密算法及详解,加密算法,是现在每个软件项目里必须用到的内容. 广泛应用在包括了用户登入.数字签名.数据传输等多个场合.今天我把常见的加密算法全部整理在这里,供大家学习参考. 首先,大家要知道加密算法能干什么,利用加密算法来对数据通信的过程进行加密传输是一种最常见的安全手段.利用该手段能够达到一下三个目的: 1.数据保密性,防止用户数据被窃取或泄露: 2.数据完整性,防止用户传输的数据被篡改: 3.通信双方身份确认,确保数据来源合法: 常见

IP的计算------HDOJ杭电2206(写完脑洞大开,想象力要足够丰富)

Problem Description 在网络课程上,我学到了很多有关IP的知识.IP全称叫网际协议,有时我们又用IP来指代我们的IP网络地址,现在IPV4下用一个32位无符号整数来表示,一般用点分方式来显示,点将IP地址分成4个部分,每个部分为8位,表示成一个无符号整数(因此不需要用正号出现),如192.168.100.16,是我们非常熟悉的IP地址,一个IP地址串中没有空格出现(因为要表示成一个32数字). 但是粗心的我,常常将IP地址写错,现在需要你用程序来判断. Input 输入有多个c

饭卡------HDOJ杭电2546(还是01背包!!!!!!)

Problem Description 电子科大本部食堂的饭卡有一种非常诡异的设计,即在购买之前推断剩余金额. 假设购买一个商品之前,卡上的剩余金额大于或等于5元,就一定能够购买成功(即使购买后卡上剩余金额为负),否则无法购买(即使金额足够).所以大家都希望尽量使卡上的剩余金额最少. 某天,食堂中有n种菜出售.每种菜可购买一次. 已知每种菜的价格以及卡上的剩余金额,问最少可使卡上的剩余金额为多少. Input 多组数据.对于每组数据: 第一行为正整数n.表示菜的数量.n<=1000. 第二行包含

杭电1272 并查集找环+判断连通

杭电1272 并查集找环+判断连通 E - E Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1272 Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了房间A和B

杭电 1272 POJ 1308 小希的迷宫

这道题是我学了并查集过后做的第三个题,教我们的学姐说这是并查集的基础题,所以有必要牢牢掌握. 下面就我做这道题的经验,给大家一些建议吧!当然,我的建议不是最好的,还请各位大神指出我的错误来,我也好改正. 1.题目概览 这道题是杭电1272,POJ 1308如果写好了代码可以试一试. 小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s

杭电 2019 数列有序!

http://acm.hdu.edu.cn/showproblem.php?pid=2019 数列有序! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 44844    Accepted Submission(s): 19451 Problem Description 有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给

杭电oj 1106

排序 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 74104    Accepted Submission(s): 22754 Problem Description 输入一行数字,如果我们把这行数字中的'5'都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以'0'开头,这些头部的'0'应该被忽略掉,除非这个整数就是由