hdu 1325

。,。 还是待整理

#include <stdio.h>

const int max_num = 100000+10;
typedef struct
{
    int num,root,conn;//数据、根、入度
}Node;

Node node[max_num];

void init()
{
    for(int i = 0; i < max_num; i++)
    {
        node[i].conn = 0;//入度初始化为0
        node[i].root= i;//根记录为自身
        node[i].num=0;//标记数字是否被使用过,0:没有被使用过,1:使用过了
    }
}

int find_root(int a)
{
    if(node[a].root!=a)
        return node[a].root = find_root(node[a].root);
    return node[a].root;
}

void union_set(int a,int b)
{
    a = find_root(a);
    b = find_root(b);
    if(a==b)//同一个根,说明是在同一个树下
    return;
    node[b].root=a;//把b的根赋为a的根,此时a已经是根,num==root
}

int main()
{
    int n,m;
    int i = 1;
    bool flag=true;//true:是个树,false:不是树
    init();
    while(scanf("%d%d",&n,&m)!=EOF&&n>=0&&m>=0)
    {
        if(!flag&&n!=0&&n!=0)continue;//已经确定不是树了,就继续循环
        if(n==0&&m==0)
        {
            int root_num=0;
            for(int j = 1; j < max_num;j++)
            {
                //判断是否为森林,如果,root_num用来记录根的数目
                if(node[j].num && find_root(j)==j)
                root_num++;
                if(node[j].conn>1)//如果出现某个节点的入度超过1,不是树
                {
                    flag = false;
                    break;
                }
            }
            if(root_num>1)//连通分支大于1,是森林不是树
                flag=false;
            if(flag)
            printf("Case %d is a tree.\n",i++);
            else printf("Case %d is not a tree.\n",i++);
            flag = true;
            init();
            continue;
        }
        if(m!=n&&find_root(n)==find_root(m))
        flag = false;
        else
        {
            //将m,n,记录为节点
            node[m].num = 1;
            node[n].num = 1;
            node[m].conn++;//入度增加一
            union_set(n,m);
        }
    }
    return 0;
}
时间: 2024-11-02 15:41:22

hdu 1325的相关文章

HDU 1325 Is It A Tree? (POJ 1308)

并查集问题... 这题以前做过-- 以前做过-- 做过-- 过-- 不过重做时候被吭得异常之爽-- 在判断 vis[i]的时候.我记得标准C++是非0 即为真. 而我用C++ 提交的时候 if(vis[i]) 去直接给我WA了. 用G++ 就AC了...然后改成if(vis[i]==1) 交C++ 就AC了. 特瞄的我每次初始化都把 vis[i] 都赋值为 0 了..都能出这种错? 求路过大神明示我的错误. 题意是判断是否是一棵树. 不能存在森林,用并查集合并,每个点的入度不能超过1. 比如 1

HDU 1325 Is It A Tree? 并查集

判断是否为树 森林不是树 空树也是树 成环不是树 数据: 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 1 0 0 1 2 2 3 4 5 0 0 2 5 0 0 ans: no no yes #include <stdio.h> #include <string.h> #include <stdlib.h> #include <limits.h> #include <malloc.h> #include <ctype

(并查集)POJ 1308 &amp; HDU 1325

一开始以为两道题是一样的,POJ的过了直接用相同代码把HDU的交了,结果就悲剧了.最后发现HDU的没有考虑入度不能大于一. 题意:用树的定义来 判断吧,无环,n个结点最多有n-1条边,不然就会有环.只有一个入度为0的结点,不存在入度大于1的结点. 思路:并查集. AC代码: #include<stdio.h> #include<string.h> #define N 100005 int in[N],pre[N],a,b,c[N]; void init()//初始化 { for(i

HDU 1325 并查集

http://acm.hdu.edu.cn/showproblem.php?pid=1325 Is It A Tree? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 26387    Accepted Submission(s): 6039 Problem Description A tree is a well-known data

HDU 1325 有根树的判断

Is It A Tree? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 33083 Accepted Submission(s): 7574 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1325 Problem Description A tree is a well-known data

HDU 1325 POJ 1308 Is It A Tree? (并查集)

这道题就是裸并查集,关键在于对不是树几种的判断 1. 空树是树 2. 森林不是树 3. 无环 或者从入度来看:1,无环:2,除了根,所有的入度为1,根入度为0:3,这个结构只有一个根,不然是森林了. 这道题本来暑假做的POJ 1308 但是HDU没有过.在于空树没有考虑. 用并查集判断有多少个森林注意编号是随机的,不是次序.... /* input: 0 0 1 1 0 0 1 2 1 2 0 0 1 2 2 3 4 5 0 0 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9

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 1325 Is It A Tree?

在hdu 1272 的基础上稍加修改就ac了 1272已经判断了无向情况下是否是树形结构,因此我们只需要多判断一下入度为0的点是否只有一个就好了 #include<iostream> #define maxn 100000+5 using namespace std; int a,b; int flag; int father[maxn]; int sign[maxn]; int r[maxn]; void ready() { for(int i=1;i<maxn;i++) r[i]=0

HDU 1325(并查集)

Is It A Tree? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 23312    Accepted Submission(s): 5338 Problem Description A tree is a well-known data structure that is either empty (null, void, no

HDU 1325 拓扑排序

根据题目所给的3个不符合情况的条件,一个个判断图是否符合这3个条件即可 1.不能出现内部环,拓扑排序判断 2.不能有超过1个点的入度为0,因为只有一个树根 3.每个点最多一个入度 这里要注意的一点是这个点的数字是乱给的,所以最大值为8,但实际上不一定有8个点,这里记录一个最大值的参数,和一个总共点数的参数来进行判断即可 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 using names