poj 1308 Is It A Tree?

简介: 点击打开链接poj 1308 思路:并查集 分析:如果是一棵树,那么就只能有唯一的一个根节点。所以我们只要在输入的时候判断两个元素能否合并即可,如果输入的两个元素的根节点相同肯定是不满足的,其它还有“空树”“森林”都不算是树。

点击打开链接poj 1308


思路:并查集
分析:如果是一棵树,那么就只能有唯一的一个根节点。所以我们只要在输入的时候判断两个元素能否合并即可,如果输入的两个元素的根节点相同肯定是不满足的,其它还有“空树”“森林”都不算是树。所以最后还要判断一下是否是森林还是树。注意句子末尾有个“.”

输入的边可能是自环,这个是一个trick


注意以下数据
1: 0 0 空树是一棵树。
2: 1 1 0 0 不是树 1 和 1的根据点相同
3: 1 2 1 2 0 0 不是树,第二个开始1 和 2的根节点相同不是树
4: 1 2 2 3 4 5 不是树  森林不算是树
5: 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 1  最后的9 和1根节点相同不是树
6: 1 2 2 1 0 0 不是树

代码:

#include<set>
#include<cstdio>
#include<cstring>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int MAXN = 1000010;

int father[MAXN];
set<int>s;

void init(){
    s.clear();
    for(int i = 1 ; i < MAXN ; i++){
        father[i] = i; 
    }
}

int find(int x){
    if(father[x] != x)
        father[x] = find(father[x]);
    return father[x];
}

int main(){
    int cas = 1;
    int x , y;
    while(scanf("%d%d" , &x , &y) && x >= 0){
         printf("Case %d " , cas++);
         if(x+y == 0)
             puts("is a tree.");
         else{
             init(); 
             father[y] = x;
             // 如果出现自环的时候x == y的时候就不算树
             bool isOk = (y != x ? true : false);
             s.insert(x);
             s.insert(y);
             while(scanf("%d%d" , &x , &y) && x+y){
                 s.insert(x);
                 s.insert(y);
                 int fx = find(x);
                 int fy = find(y);
                 if(fy == fx){
                     isOk = false; 
                 } 
                 else{
                     father[fy] = fx; 
                 }
             } 
             if(!isOk)
                 puts("is not a tree.");
             else{
                 set<int>::iterator it = s.begin();
                 int root = find(*it);
                 for(it++; it != s.end() ; it++){
                     if(root != find(*it)){
                        isOk = false;
                        break;
                     } 
                 }
                 if(isOk)
                     puts("is a tree.");
                 else
                     puts("is not a tree.");
             }
         }
    }
    return 0;
}





目录
相关文章
|
存储 算法 搜索推荐
时间复杂度:一步步理解算法效率
时间复杂度:一步步理解算法效率,更多文章可关注我的微信公众号:Python学习杂记
1138 0
|
设计模式 IDE Java
如何将代码写的更加优雅?
如何将代码写的更加优雅?
133 0
|
机器学习/深度学习 传感器 算法
【配电网重构】基于yalmip求解含sop+二阶锥配电网重构附matlab代码
【配电网重构】基于yalmip求解含sop+二阶锥配电网重构附matlab代码
|
22小时前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
10天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
4天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
429 191
|
3天前
|
数据采集 消息中间件 人工智能
跨系统数据搬运的全方位解析,包括定义、痛点、技术、方法及智能体解决方案
跨系统数据搬运打通企业数据孤岛,实现CRM、ERP等系统高效互通。伴随数字化转型,全球市场规模超150亿美元,中国年增速达30%。本文详解其定义、痛点、技术原理、主流方法及智能体新范式,结合实在Agent等案例,揭示从数据割裂到智能流通的实践路径,助力企业降本增效,释放数据价值。