hdu 1325 判断是否是一棵树

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1325

题目大意:就是判断这个图是不是一棵树,并且说明了树每个节点之间的指向都只有明确的一条。

一直TLE感觉不科学。。。结果看了discuss说只要是负数就结束,并不一定要-1 -1结束。。。好吧跪了,对于结束条件要仔细回到题目中找。。

还有就是这题居然不告诉我数据范围orzzzzzz

又出现了忘记初始化的情况。。。特别是一开始没有写的数组,后来觉得再开一个的话,一定要记得初始化,居然找了好久orzzzz

思路:我的理解就是树的话每一个节点的入度都不能超过1,而且必须要有一个点的入度为0,而且不能环(不过有环的话肯定不能全部满足前面的条件)。

结果发现就跟之前的1272一样是可以用并查集做的。。。我好像是看到是有向图就放弃并查集了orzzzzz果然图样。。

不过也确实并查集判断是否成环,并判断是否只有一个集合(就是一个根节点) 跟之前完全一样嘛···

改天写一下并查集的。。附上别人的博客链接:http://blog.csdn.net/a601025382s/article/details/8196477 

没细看,明天自己写一遍。。

贴上没用并查集的代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define M 100009
#define INF 0x3f3f3f3f
int in[M];
int mark[M];
int main()
{
    int kase = 0;
    int a,b;
    while(true)
    {
        memset(in,0,sizeof(in));
        memset(mark,0,sizeof(mark));  //又漏了这个初始化。。
        int ok = 0;
        int max = -INF;
        for(;;)
        {
            int a,b;
            scanf("%d %d",&a,&b);
            mark[a] = 1;mark[b] = 1;
            if(a>max) max=a;
            if(b>max) max=b;//找出最大的数据
            if(a==0&&b==0) break;
            if(a<0||b<0) goto out;
            if(ok) continue;
            in[b]++;
            if(in[b]>1)  //如果有点入度超过1 ,那么肯定不是树
            {
                ok = 1;
                continue;
            }
        }
        if(ok)
            printf("Case %d is not a tree.\n",++kase);
        else
        {
            int ans = 0;
            for(int i = 1;i <= max;i++)
            {
                if(mark[i])
                {
                    if(in[i]==0)   //判断是否是有一个入度为0的点
                        ans++;
                }
            }
            if(ans!=1)
                printf("Case %d is not a tree.\n",++kase);
            else
                printf("Case %d is a tree.\n",++kase);
        }
    }
    out:
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值