zoukankan      html  css  js  c++  java
  • HDU 1325,POJ 1308 Is It A Tree

    HDU认为1>2,3>2不是树,POJ认为是,
    而Virtual Judge上引用的是POJ数据
    这就是唯一的区别....(因为这个瞎折腾了半天)

    此题因为是为了熟悉并查集而刷,其实想了下其实好好利用sort应该能更简单A掉,下次有空再去试试...

    题目大意:判断是否为树,so:

    1,无环;

    2,除了根,所有的入度为1,根入度为0;

    3,这个结构只有一个根,不然是森林了;
    4.空树也是树,即第一次输入的两个数字为0 0则是树,其他时候输入只是结束条件

    因为POJ和HDU题面一样,要求不一样,所以这题解法唯一区别就是
    HDU上用所有节点的总父节点唯一判断,而POJ则每输入两个数,判
    断他们总父节点是否相等,相等则成环了.

    hdu AC代码:http://paste.ubuntu.com/25081598/
    POJ AC代码:http://paste.ubuntu.com/25081600/

    下面贴的是POJ上AC的代码:

    //Is It A Tree?
    #include<stdio.h>
    #include<cmath>
    #include<string.h>
    #include<iostream>
    #include<algorithm>
    #define INF 0x3f3f3f3f
    using namespace std;
    #define maxn 1005
    int pre[maxn],visB[maxn],root,vis[maxn],MAX,flag=0;
    void iint()
    {
        for(int i=0; i<=maxn; i++)
        {
            pre[i]=i;
            visB[i]=0;
            vis[i]=0;
        }
        MAX=0;  flag=0;
    }
    int find(int x)
    {
        return x==pre[x]?x:find(pre[x]);
    }
    void join(int x,int y)
    {
        int fx=find(x),fy=find(y);
        if(fx!=fy)  pre[fx]=fy;
    }
    int main()
    {
        int a,b,Case=1/*,real_flag1=0*/,FLAG=0;
        iint();
        while(~scanf("%d%d",&a,&b),a>=0&&b>=0)
        {
            if(a==0&&b==0&&flag==0)
            {   //空树也是树
                printf("Case %d is a tree.
    ",Case++);
                iint();
                continue;
            }
            flag=1;
            visB[b]++;
            vis[a]=vis[b]=1;
    
            MAX=max(MAX,a);    MAX=max(MAX,b);
            /*for(int i=1; i<=MAX; i++)
            {
                if(vis[i]&&visB[i]>1)  real_flag1=1;
                //判断根节点是否都有且只有一次,或者说父节点只有一个
                if(vis[i]&&visB[i]==0)   real_flag2++;
                //非环时,最高父节点不会被指向,所以不被指的有且只有1个
                //POJ会WA可能是,如3->1  2->1都算一个树了,2333
            }*/
            /*if(real_flag1)   FLAG=1;*/   //天真
    
            if(find(a)==find(b)&&a!=0&&b!=0) FLAG=1;
           记住:1->2 ,3->2时候也是树,所以判断是否为环,直接在每次读       入两个数字时候看它们的最高父节点是否相等,相等泽成环,比如
    1->2,2->3,3>1.
             
            join(a,b);
    
            if(a==0&&b==0)
            {
                int ans=0;
                for(int i=1; i<=MAX; i++)
                    if(vis[i]&&pre[i]==i)  ans++;
    
                if(ans!=1||FLAG)  printf("Case %d is not a tree.
    ",Case++);
                else  printf("Case %d is a tree.
    ",Case++);
    
                iint();
                /*real_flag1=0;*/ FLAG=0;
                continue;
            }
        }
        return 0;
    }
    

      

  • 相关阅读:
    DPDK — 网卡初始化流程(Intel 82599 ixgbe 网卡驱动示例)
    leetcode 3. 无重复字符的最长子串
    20193120 实验四 Python综合实践
    hadoop常用的端口号
    Django学习笔记
    ORACLE EBS AP invoice 到付款的数据流
    EBS 系统标准职责定义MAP
    Advanced Pricing
    Oracle Advanced Pricing White Papers
    增加AP INVOICE 行&分配行
  • 原文地址:https://www.cnblogs.com/weimeiyuer/p/7162605.html
Copyright © 2011-2022 走看看