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.h>
#include <math.h>
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
typedef long long LL;
const int maxn =10000+5;
const int maxe = 15000+5;
const int INF = 460002326;
const int mod = 1000000009;//q[i]表示点i 对应的点 rank[i]表示入度
int fa[maxn],q[maxn],rank[maxn],taj,flag;//taj表示当前点的编号个数
void init()
{
    flag=0;
    taj=1;
    for(int i=0; i<maxn; i++)
        fa[i]=i,q[i]=-1,rank[i]=0;
}
int find(int x)
{
    if(fa[x]==x)
        return x;
    else
    {
        fa[x]=find(fa[x]);
        return fa[x];
    }
}
void merge(int x,int y)
{
    int fx=find(x),fy=find(y);
    if(fx==fy)
    {
        flag=1;//重复
        return ;
    }
    else
    {
        fa[fy]=fx;
        rank[y]++;//入度+1
        return ;
    }
}
void dian(int a,int b)
{
    if(q[a]==-1)
        q[a]=taj++;
    if(q[b]==-1)
        q[b]=taj++;
}
int main()
{
    int a,b,cas=0;
    //   freopen("in.txt","r",stdin);
    while(scanf("%d%d",&a,&b),a+b>=0)
    {
        init();//初始化
        if(a==0&&b==0)// 0 0 也算树
        {
            printf("Case %d is a tree.\n",++cas);
            continue;
        }
        a=q[a],b=q[b];
        merge(a,b);
        while(scanf("%d%d",&a,&b))
        {
            if(a+b==0) break;
            dian(a,b);
            a=q[a],b=q[b];
            merge(a,b);
        }
        a=0;
        for(int i=1; i<maxn; i++)
            find(i);
        for(int i=1; i<maxn; i++)
        {
            if(q[i]!=-1&&fa[q[i]]==q[i])//根节点
                a++;
            if(rank[i]>1)
                flag=1;
        }
        printf("Case %d is ",++cas);
        if(a==1&&flag==0&&taj>2)
            puts("a tree.");
        else puts("not a tree.");
    }
    return 0;
}

HDU 1325 Is It A Tree? 并查集

时间: 2024-08-01 06:25:05

HDU 1325 Is It A Tree? 并查集的相关文章

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

HDU1325 Is It A Tree? 并查集

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1325 这题与HDU1272 小希的迷宫 (并查集) 非常像,不过细细看,还是有一点区别的.就是这题的路径是单向的,每次只能由起点指向终点,在连接之前终点必须是根节点. 注意的问题: 1.不能成环,即每次输入的两个数的根节点不能相同: 2.最终根节点数目为一 3.注意当只输入"0 0" 时要输出"Case %d is a tree." 4.路径是单向的,即每次只能由起点指

hdu 5458 Stability(树链剖分+并查集)

Stability Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 65535/102400 K (Java/Others)Total Submission(s): 1347    Accepted Submission(s): 319 Problem Description Given an undirected connected graph G with n nodes and m edges, with possibly r

HDU 3047 Zjnu Stadium 带权并查集

题目来源:HDU 3047 Zjnu Stadium 题意:给你一些人 然后每次输入a b c 表示b在距离a的右边c处 求有多少个矛盾的情况 思路:用sum[a] 代表a点距离根的距离 每次合并时如果根一样 判断sum数组是否符合情况 根不一样 合并两棵树 这里就是带权并查集的精髓 sum[y] = sum[a]-sum[b]+x 这里y的没有合并前b的根 #include <cstdio> #include <cstring> using namespace std; cons

hdu 1829 A Bug&#39;s Life 并查集系列

1 #include "cstdio" 2 #include "iostream" 3 #include "cstring" 4 #include "vector" 5 #include "queue" 6 using namespace std; 7 8 #define MAXN 2222 9 int fa[MAXN]; 10 int rnk[MAXN]; //秩 表示某点与根的距离 11 int n,

HDU 3367 Pseudoforest(伪森林)(并查集)

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3367 题意:在图论中,如果一个森林中有很多连通分量,并且每个连通分量中至多有一个环,那么这个森林就称为伪森林. 现在给出一个森林,求森林包含的最大的伪森林,其大小通过所有边的权值之和来比较. 分析: 1.一开始想的是:在每个连通分量中求一个最大生成树,然后加一条最大的边,再把每个连通分量算出来的值加起来,但WA了.这并不是最优的,因为还存在这种情况:一个连通分量里最初有两个环,但是伪森林要求最多一个

hdu 1272 小希的迷宫(简单并查集)

小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 31396    Accepted Submission(s): 9726 Problem Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是

POJ 2492 || HDU 1829:A Bug&#39;s Life(并查集)

传送门: POJ:点击打开链接 HDU:点击打开链接 A Bug's Life Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 27624   Accepted: 8979 Description Background Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes that they fe

HDU 1232:畅通问题(并查集)

畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 29362    Accepted Submission(s): 15452 Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可以实现交通(但不一定有