Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Is It A Tree?(并查集)

Is It A Tree?(并查集)

作者头像
用户1624346
发布于 2018-04-11 09:34:25
发布于 2018-04-11 09:34:25
7370
举报
文章被收录于专栏:calmoundcalmound

判断树是否唯一

1.只有一个根节点,(1)在一棵树上一个根节点。1 2 3 2就是两个根节点(1)只有一棵树

2.不成环,入度不大于1

由于数组运行超界导致wa,这是老毛病了 还一直错

代码语言:javascript
AI代码解释
复制
#include<stdio.h>
const int MAXN=1000100;
int father[MAXN],rank[MAXN];

struct Node
{
    int x,y;
} node[MAXN];

void Make_set()
{
    for(int i=1; i<MAXN; i++)
    {
        rank[i]=0;
        father[i]=i;
    }
}

int Find(int x)
{
    int r=x;
    while(r!=father[r])
    {
        r=father[r];
    }
    if(r!=x) father[x]=r;
    return father[x];
}

void Union(int x,int y)
{
    //秩小的加到大的里
   /* if(rank[x]>rank[y])
    {
        father[y]=x;
    }
    else
    {
        if(rank[x]==rank[y])
        {
            rank[y]++;
        }
        father[x]=y;
    }*/
    father[y]=x;
}

int main()
{
    int cas,flag,i;
    int tes=1;
    while(1)
    {
        cas=flag=0;
        while(scanf("%d%d",&node[cas].x,&node[cas].y))
        {
            if(node[cas].x==-1 && node[cas].y==-1) return 0;
            if(node[cas].x==0 && node[cas].y==0) break;
            cas++;
        }
        Make_set();
        for(i=0; i<cas; i++)
        {
            int x=Find(node[i].x);
            int y=Find(node[i].y);
            if(x==y)
            {
                flag=1;
            }
            else Union(x,y);
        }
        int temp=Find(node[0].x);
        for(i=0; i<cas; i++)
        {
            if(Find(node[i].x)!=temp) flag=1;
            if(Find(node[i].y)!=temp) flag=1;
        }
        if(flag) printf("Case %d is not a tree.\n",tes++);
        else printf("Case %d is a tree.\n",tes++);
    }
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2012-08-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【zzuliOJ】1900 - 985的“树”难题(bfs & 并查集)
Time Limit: 1 Sec Memory Limit: 128 MB Submit: 35 Solved: 10 Submit Status Web Board
FishWang
2025/08/27
1940
【杭电oj】1325 - Is It A Tree?(树,并查集)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 19420 Accepted Submission(s): 4349 Problem Description
FishWang
2025/08/26
1750
【杭电oj】1325 - Is It A Tree?(树,并查集)
More is better(并查集)
#include<stdio.h> #include<string.h> const int MAXN=10000010; int father[MAXN],hash[MAXN]; void Make_set() { for(int i=0;i<MAXN;i++) { father[i]=i; //rank[i]=0; } } int Find(int x) { int r=x; while(r!=father[r]) {
用户1624346
2018/04/11
6420
DSU_Exercise
dbq。 Template //非路径压缩 int find_1(int x) { int r = x; while(pre[r]!=r) { r = pre[r]; } return r; } //路径压缩 int find(int x) { if(pre[x]==x) return x; else { return pre[x] = find(pre[x]); } } void jo
AngelNH
2020/04/16
3130
poj----(1470)Closest Common Ancestors(LCA)
Closest Common Ancestors Time Limit: 2000MS Memory Limit: 10000K Total Submissions: 15446 Accepted: 4944 Description Write a program that takes as input a rooted tree and a list of pairs of vertices. For each pair (u,v) the program determines
Gxjun
2018/03/26
8080
poj----(1470)Closest Common Ancestors(LCA)
poj----1330Nearest Common Ancestors(简单LCA)
题目连接  http://poj.org/problem?id=1330 就是构建一棵树,然后问你两个节点之间最近的公共父节点是谁? 代码: 1 /*Source Code 2 Problem:
Gxjun
2018/03/26
7470
CSU 1326: The contest(分组背包)
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1326 题意:       n个题目,每个题目都有一个价值Pi和相对能力消耗Wi,但是有些题目因为太
用户1624346
2018/04/17
6600
Hand in Hand(并查集)
题意:判断两个图形是否相似,根据题意可以知道图形的分量,不是环就是链,所以我们只要依次两个图形是否一样就可以了 分析:若两个图形完全一样的话,那么它们成环和成链的个数必定一样,当然成环(链)的点的个数也是一样的,所以我们可以忽视结点的本身,          而值注重这个点代表的意义就可以。一样的两图排序后,自然会有对等的点和对等相同意义的点 #include<stdio.h> #include<algorithm> using namespace std; const int MAXN=10010; i
用户1624346
2018/04/17
6310
POJ 1308 Is It A Tree?
       题意是判断这是不是一棵树,条件就是不能有环,而且只能有一个根节点,和小希的迷宫哪道题差不多,可以看下判断有没有环的详解传送门,这道题呢需要加一个改动的地方就是因为不知道这个树的大小,可能不是从1开始的,也不知道是从多少结束的,所以刚开始要把最大值和最小值记录下来。
Ch_Zaqdt
2019/01/10
3800
04-树5. File Transfer--并查集
  对于一个集合常见的操作有:判断一个元素是否属于一个集合;合并两个集合等等。而并查集是处理一些不相交集合(Disjoint Sets)的合并及查询问题的有利工具。 并查集是利用树结构实现的。一个集合用一棵树来表示,而多个集合便是森林。并查集中的“并”是将两个集合合并即两棵树合并成一颗树;“查”是查找一个元素属于哪个集合,即查找一个节点属于哪棵树。思路如下: 查:通过节点找寻父节点,一直向上查找直到根节点,返回根节点,而根节点代表唯一的那棵树; 并:先查找到两个节点所在的树,如果在同一棵树中(即查找到的根
llhthinker
2018/01/24
6620
POj 1797 Heavy Transportation
题意:求从1-n所能承受的最大重量是多少,其最大重量就是1-n通路的最小边 分析:求最大生成树的最小边,排序的时候按照权值从大到小派,然后生成树,知道找到1-n的通路就可以了 #include<stdio.h> #include<algorithm> using namespace std; const int MAXN=1005; const int INF=0x7fffffff; int father[MAXN]; int rank[MAXN]; int ans,n,m; struct Edge
用户1624346
2018/04/11
6650
hdu---(1325)Is It A Tree?(并查集)
Is It A Tree? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To
Gxjun
2018/03/26
9390
hdu---(1325)Is It A Tree?(并查集)
How Many Tables (并查集)
题意:找几个不相连的团体,最后查找发现只要father有几个是自己的,就有几个团队,这个我没想到 #include<stdio.h> #include<string.h> const int MAXN=1010; int father[MAXN],rank[MAXN]; int hash[MAXN]; void Make_set(int n) { for(int i=0;i<=n;i++) { father[i]=i; rank[i]=0; } }
用户1624346
2018/04/11
6340
NYOJ129 决策树 【并检查集合】
时间限制: 1000 ms | 内存限制: 65535 KB
全栈程序员站长
2022/07/11
1940
HDU 4616 Game 树形DP
Problem Description   Nowadays, there are more and more challenge game on TV such as ‘Girls, Rush Ahead’. Now, you participate int a game like this. There are N rooms. The connection of rooms is like a tree. In other words, you can go to any other room by one and only one way. There is a gift prepared for you in Every room, and if you go the room, you can get this gift. However, there is also a trap in some rooms. After you get the gift, you may be trapped. After you go out a room, you can not go back to it any more. You can choose to start at any room ,and when you have no room to go or have been trapped for C times, game overs. Now you would like to know what is the maximum total value of gifts you can get.
风骨散人Chiam
2020/10/28
3270
LCT学习笔记
最近自学了一下LCT(Link-Cut-Tree),参考了Saramanda及Yang_Zhe等众多大神的论文博客,对LCT有了一个初步的认识,LCT是一种动态树,可以处理动态问题的算法。对于树分治中的树链剖分,只能处理静态的数据或者在轻重链上的边或点的权值,对于其他动态的处理就毫无办法了。因此我们就需要引入LCT这个东西。那么问题来了,LCT到底是什么呢?我弄了很久总算是理解了LCT,打算总结一下LCT的基本操作。 ①浅谈对LCT的初步印象 LCT用来维护动态的森林,以及一些链上操作,是处理节点无序的有根
Angel_Kitty
2018/04/09
1.3K0
LCT学习笔记
食物链-poj1182(带权并查集经典模板)
不同树合并且更新关系 (x 树做主根) ' 如果 x 和 y 为关系 r1, y 和 z 为关系 r2, 那么 x 和 z 的关系就是(r1+r2)%3 如果 d==1 则 x 和 y 是同类 ,那么 y 对 x 的关系是 0, 如果 d==2 , 则 x 吃了 y, 那么 y 对 x 的关系是 1, x 对 y 的关系是 2。综上所述 , 无论 d 为 1 或者是为 2, y 对 x 的关系都是 d-1。 fy 对 y 的关系为 3-r[y] (有点互补的感觉,注意这里是不同类喔) y 对 x 的关系为 d-1, x 对 fx 的关系为 r[x] 所以 fy 对 fx 的关系是(3-r[y] + d-1 + r[x])%3。可以借助向量图理解 fy->y->x->fx
Cell
2022/02/25
2520
食物链-poj1182(带权并查集经典模板)
Farm Irrigation
题意:判断图中的图形有几个集合。         这道题做的郁闷死我了,为了找开始字母的错误一个一个匹对。         这道题让我也懂得了表格的位置可以代表并查集的点,这样每个都不一样,而我想的那种用字母是否本身来判断有多少个集合是错误的,很明显一个字母不会只出现一次。而且在计算位置的时候也出错了,应该i*列代表的第几行 #include<stdio.h> #include<string.h> const int MAXN=110; int total; int gra_row[MAXN][MAXN],
用户1624346
2018/04/17
4790
并查集(union-find sets)
一.并查集及其优化 - 并查集:由若干不相交集合组成,是一种简单但是很好用的数据结构,拥有优越的时空复杂性,一般用于处理一些不相交集合的查询和合并问题。 - 三种操作: 1.Make_Set(x) 初始化操作,初始化的时候,每个结点各自为一个集合,这个时候father[i]=i,即此时这个结点就是这个集合的根结点,也就是它本身。 2.Find_Set(x) 查找操作,其具体功能就是找到x这个元素所在集合的根结点。可以用来判断两个结点是否在同一个集合,如果根结点不同自然就不再同一个集合中。 3.Union(x,y) 合并操作,将连个元素合并到同一个集合当中,在合并之前,一般利用Find_Set()来判断是否在同一个集合当中。
Enterprise_
2019/02/21
1.6K0
LCA详解_lca软件
LCA问题(least Common Ancestors,最近公共祖先问题),是指给定一棵有根树T,给出若干个查询LCA(u,v)(通常查询数量较大),每次求树T中两个顶点u和v的最近公共祖先,即找到一个节点,同时是u和v的祖先,并且深度尽可能的大(尽可能远离树根).
全栈程序员站长
2022/11/19
6190
LCA详解_lca软件
相关推荐
【zzuliOJ】1900 - 985的“树”难题(bfs & 并查集)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档