参考网址:http://blog.sina.com.cn/s/blog_6827ac4a0100nyjy.html

解题思路:

由于这里出现的数字不一定连续的数字都会出现,所以设一个mark来标记数字是否出现过。每次输入一对数字的关系则进行查找根结点的函数,即:

if(aa==bb)

{

flag=1;

}

如果能查找到根结点就证明二者已经是相通的,再输入二者的关系就变成有多条相通的路径了。如果不能查找到根结点则继续标记他们的关系。到一个数据输入结束后,再进行判断,是否输入的关系每个数字之间都有相通的路径,即:

for(i=min;i<=max;i++)

{

if(mark[i]&&set[i]==i)

cnt++;

}

if(cnt==1)

printf("Yes\n");

else

printf("No\n");

}

这里还有一个小注意:如果每测试数据已0  0输入,也应打印出Yes

参考代码:

#include<stdio.h>
#include<algorithm>
using namespace std;

int set[100010];
bool mark[100010];
int flag;
int find(int x)
{
int r=x;
while(set[r]!=r)
r=set[r];
return r;

}
void merge(int x,int y)
{
int fx,fy;
fx=find(x);
fy=find(y);
if(fx!=fy)
set[fx]=fy;

}
//每次都是这两个函数的出现,
//就一个是寻找根节点的,还有一个是
//连接两个树的函数,过程相对复杂
//感觉自己是要牢记这两个函数了,无奈啊
int main()
{
int a,b,i;
while(scanf("%d%d",&a,&b)!=EOF)
//本题的输入还是采取一贯的模式作风,
//这个也是值得自己学习的东西的,
//不能因为输入格式的变而改变了自己的书写套路
{
flag=0;int cnt=0;
if(a==-1&&b==-1)break;

if(a==0&&b==0)
{
printf("Yes\n");
continue;
}

for(i=0;i<100010;i++)
{
set[i]=i;
mark[i]=0;
}
//两个初始化,一个用来标记根节点,
//还有一个用来初始化为0
int max=-1,min=100010;
while(a||b)//当a,b均不为0时的标记
{
if(a>max)max=a;
if(b>max)max=b;
if(a<min)min=a;
if(b<min)min=b;//将最大值和最小值都标记出来
mark[a]=1;
mark[b]=1;//当一个数有输入之后就选择将它打好标记
int aa=find(a);
int bb=find(b);
if(aa==bb)
{
flag=1;
}
//用来判断两个数是不是一组的,如果是的话就不进行操作了,
//如果不是那么我们就要选择让他们联通成为一棵树
else
merge(aa,bb);
scanf("%d%d",&a,&b);
}
if(flag==1)
printf("No\n");
else
{
for(i=min;i<=max;i++)
{
if(mark[i]&&set[i]==i)
cnt++;

}
if(cnt==1)
printf("Yes\n");
else
printf("No\n");
}

}
return 0;
}

当然,这里还有一个非常相像的题目叫

hdu 1325 Is It A Tree?(并查集)

就是一个有向图和一个无向图的区别

代码

#include <stdio.h>

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

//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)//当输入的值为-1时,循环结束
{
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;
}

HDU1272 小希的迷宫 并查集的更多相关文章

  1. hdu1272 小希的迷宫(并查集)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272 题目: 小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) ...

  2. HDU1272小希的迷宫–并查集

    上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了 ...

  3. hdu-1272 小希的迷宫---并查集或者DFS

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1272 题目大意: Problem Description 上次Gardon的迷宫城堡小希玩了很久(见 ...

  4. HDU-1272小希的迷宫,并查集?其实不用并查集;

    小希的迷宫                                                                                               ...

  5. hdu1272小希的迷宫(并查集判断回路和是否连通)

    传送门 迷宫中不能有回路,还要连通 如果最后集合数是一个那就是连通,否则不联通 要合并的两个顶点在相同集合内,表示出现了回路 输入时注意一下 #include<bits/stdc++.h> ...

  6. HDU 1272 小希的迷宫 并查集

    小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  7. hdu 1257 小希的迷宫 并查集

    小希的迷宫 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1272 D ...

  8. <hdu - 1272> 小希的迷宫 并查集问题 (注意特殊情况)

     本题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272 Problem Description: 上次Gardon的迷宫城堡小希玩了很久(见Probl ...

  9. TZOJ 2648 小希的迷宫(并查集)

    描述 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道 ...

随机推荐

  1. redis10--主从模式

    redis的主从模式(1)介绍redis存储数据是在内存中运行的,运行速度比关系型数据库要快一些.而且它具有SortSet/Hash等具有特色的数据类型,这是其它数据库无法比拟的.redis有增删改查 ...

  2. easyUI的treegrid列表添加查询

    一些数据使用treegrid显示,添加筛选条件, 首先创建treegrid列表 var tree = $("#TreeGrid").treegrid({ url:"cha ...

  3. Latex问题收集

    1. Latex中的空格 两个quad空格 a \qquad b 两个m的宽度 quad空格 a \quad b 一个m的宽度 大空格 a\ b 1/3m宽度 中等空格 a\;b 2/7m宽度 小空格 ...

  4. 跨域资源共享(Cross-Origin Resource Sharing)

    目前中文方面的资料还比较少,能搜索到的那仅有的几篇相关介绍,也几乎是雷同的,其中C#方面的更是少之又少. XMLHttpRequest接口是Ajax的根本,而Ajax考虑到安全性的问题,是禁止跨域访问 ...

  5. ACdream 1728 SJY's First Task

    简单题. 先建树,我用邻接表来存了.然后对于每个叶子结点DFS一下,DFS深度超过了K就return,找到了叶子节点就记录下来,最后排个序,然后输出答案. 由于结点编号比较奇葩,所以用两个map来转换 ...

  6. 如何区分javascript中的方法(method)、函数(function)、事件(event)三个概念?

    方法是程序对某操作的处理,比如show(),你可以在触发单击事件的时候调用show(),也可以在双击的时候调用. 函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块.比如自己写的倒计时函数,触 ...

  7. Struts2权威指南笔记

    Struts2权威指南笔记 1.mvc特点包括: ① 多个视图可以对应一个模型 ② 模型返回的数据与显示逻辑分离 ③ 应用层被分隔为三层,降低了各层之间的耦合,提供了应用的可扩展性 ④ 控制层的概念也 ...

  8. XML 用途

    XML 用途 XML 应用于 Web 开发的许多方面,常用于简化数据的存储和共享. XML 把数据从 HTML 分离 如果您需要在 HTML 文档中显示动态数据,那么每当数据改变时将花费大量的时间来编 ...

  9. 安卓---achartengine图表----简单调用----使用view显示在自己的布局文件中----actionBar的简单设置

    AChartEngine 是一个安卓系统上制作图表的框架,关于它的介绍大家可以百度,也可以参考下面这篇博客http://blog.csdn.net/lk_blog/article/details/76 ...

  10. DOS/VBS - 用 bat 批处理 实现自动telnet

    一.VBS法 1. 建立一个tel.vbs脚本 '建立Shell对象 set sh=WScript.CreateObject("WScript.Shell") WScript.Sl ...