【并查集】判断是否为树

2024-04-29 17:48
文章标签 查集 为树 判断 是否

本文主要是介绍【并查集】判断是否为树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【问题描述】

树是一种大家都不陌生的数据结构,它有可能是一颗空树或是一些满足要求的节点连接而成的有向边的集合。

一棵树只有一个根节点,根节点没有指向它的边。

除了根节点的每一个节点都只有一条边指向它。

出现环的图都不是树。

对一些节点连接而成的有向边的集合进行判定,判定每一组的输入数据构成的图是否是一棵树。

【输入】

每输入一对都为0的数时,表示一组数据输入完毕。每条边由一对正整数表示,第一个数为有向边的起始点,第二个数为有向边的终止点。一对负数的输入表示输入的结束。

【输出】

每组测试数据输出一行判定结果,若输入的图为树,则输出“Case k is a tree.”,否则输出“Case k is not a tree.”。其中k表示每组数据的编号(编号从1开始)。

【解题报告】

运用并查集可以判定一个图是否为树。

根据树的定义与特点,需考虑的情况有:

(1)树中节点至多只能有一个父节点;

(2)树中不能出现环;

(3)构成的图只能有一个根节点,否则构成的将是森林而不是一棵树。

通过观察输入输出可知,题中编号是随即的,所以在编程中要对出现的点标记才能判断。

Step1:对每对输入的根节点标记表示这些节点出现过,进行并操作。并操作时两个节点不能有相同的根节点否则将构成环;假设b节点要接到a上,则要保证b节点是一个根节点,否则若进行并操作,b将会有两个父节点;若无以上情况,则可以合并两棵树。

Step 2:每组数据输入结束后,要计算整个图中的根节点总数,若根节点总数不为1,则构成的图不是一棵树。

Step 3:根据以上判断就可以输出结果了,每组结果输出后要初始化数据。

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  int father[1000000], flag[1000000];  int findset(int x)//查  
{  if(x != father[x])  father[x]=findset(father[x]);//路径压缩  return father[x];  
}  int unionset(int a, int b)//并  
{  int x=findset(a);  int y=findset(b);  if(y != b)//b连接在a上,要保证b是个根节点,否则b将有两个父节点  return 1;  if(x == y)//如果a,b在同一棵树中,若再进行并操作就会产生环  return 1;  else  father[y]=x;//若无以上情况,则可以合并两棵树  return 0;  
}  int main()  
{  int a, b, key=0, p=1, i, max=0, t=0;  for(i=1; i<=999999; i++)  father[i]=i;  memset(flag, 0, sizeof(flag));  while(1)  {  scanf("%d%d", &a, &b);  if(a>max) max=a;  if(b>max) max=b;  if(a<=-1 && b<=-1) break;  if(a==0 && b==0)  {  for(i=1; i<=max; i++)  {  if(flag[i]==1 && father[i]==i)  t++;  if(t>=2) break;  }  if(key>0 || t>=2)  printf("Case %d is not a tree.\n", p++);  else  printf("Case %d is a tree.\n", p++);  for(i=1; i<=999999; i++)  father[i]=i;  key=0; t=0; max=0;  memset(flag, 0, sizeof(flag));  continue;  }  flag[a]=1;flag[b]=1;//对输入的编号标记  key+=unionset(a,b);//若出现不合法的情况,key的值会大于0  }  }  


这篇关于【并查集】判断是否为树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/946746

相关文章

python数据类型判断type与isinstance的区别

在项目中,我们会在每个接口验证客户端传过来的参数类型,如果验证不通过,返回给客户端“参数错误”错误码。 这样做不但便于调试,而且增加健壮性。因为客户端是可以作弊的,不要轻易相信客户端传过来的参数。 验证类型用type函数,非常好用,比如 >>type('foo') == strTrue>>type(2.3) in (int,float)True 既然有了typ

2.28学习内容,android,dialog自定义宽高、ios判断网络可用性

android设定dialog宽高读: http://blog.csdn.net/true100/article/details/43982763 mDialog = new Dialog(getActivity(), R.style.IsDelDialog);//自定义的样式,没有贴出代码来 mDialog.setContentView(view); Window dialogWindow

IE中判断页面加载完毕方法

在IE中如果点击链接操作而此时页面又没有加载完毕,有时在特殊情况下会出现错误提示,而在FireFox中则不会出错,可做判断如下:    <script type="text/javascript">        var start;                      //监听变量        var tag;                        //标记变量

js浏览器判断

为了兼容不同浏览器显示,第一步是浏览器类型的确定,使用window.navigator.userAgent属性完成这项工作: function  getExplorer() { var explorer = window.navigator.userAgent ; //ie  if (explorer.indexOf("MSIE") >= 0) { return 'ie'; } //firefo

iOS 中基础字符判断函数收集(如判断大小写、数字等)

函数:isdigit 用法:#include 功能:判断字符c是否为数字 说明:当c为数字0-9时,返回非零值,否则返回零。 函数:islower 用法:#include 功能:判断字符c是否为小写英文字母 说明:当c为小写英文字母(a-z)时,返回非零值,否则返回零。 函数:isupper 用法:#include 功能:判断字符c是否为大写英文字母 说明:

Android 免打扰时间段范围判断

刚好需要在Android中判断当前时间是否在一个时间段范围内,在网上查找到现成的方法,现在分享一下。 可以根据具体需要修改一下时间范围的提供方式,此方法使用4个int值提供了一个时间范围。 /*** 判断当前系统时间是否在指定时间的范围内* * @param beginHour* 开始小时,例如22* @param beginMin*

C#拼接长字符串,根据是否查询到值来动态赋值。

//查询语句写在这try{while (reader.Read()){if (reader.HasRows){JSONstring += "{";JSONstring += "\"" + "wx_id" + "\":\"" + reader.GetString("wx_id") + "\",";beNeck = reader.GetString("beNeck");if (beNeck != "0

Gradle插件之判断环境环境变量

背景:在设计插件化开发的时候,涉及到插件和宿主同时编译,但不想依赖dependency属性来维护顺序,而是通过执行顺序来保证, 但是遇到一个问题就是当配置了 org.gradle.parallel属性之后,就变成平行编译,同时进行谁先谁后就没有办法保证了,所以不允许设置这个属性,但是有几十个产品线,不可能我每个团队都通知一声,而且还有新同事,一旦出现问题,不清楚的情况,可能耗费大家的一些时

LabVIEW如何检测自动调压器是否能正常工作?

LabVIEW是一个功能强大的图形化编程平台,可用于开发各种自动化和测试应用。要使用LabVIEW来检测自动调压器是否能正常工作,你可以按照以下步骤进行: 传感器接口:首先,将压力传感器或其他适当的传感器与LabVIEW系统连接。这些传感器可以检测自动调压器输出的压力或其他相关参数。 数据采集:使用LabVIEW编写程序来采集传感器输出的数据。这可能涉及设置数据采集频率、采样时间和其他相关参

Java解析Xml文件—判断Xml文件的节点是否存在子节点_以及对节点下不同子节点的内容解析方式

XML文件 <HotelGeoList> <HotelGeo Country="中国" ProvinceName="重庆" ProvinceId="0400" CityName="开县(重庆)" CityCode="0424"> <HotelGeo Country="中国" ProvinceName="重庆" ProvinceId="0400"