热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

hdu1272小希的迷宫解题报告

题目链接:http:acm.hdu.edu.cnshowproblem.php?pid1272第二条并查集,和畅通工程的解法类似。判断小希的迷宫不符合条

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272

      第二条并查集,和畅通工程的解法类似。判断小希的迷宫不符合条件,即有回路。我的做法是,在合并两个集合的时候,当fx = fy,即有共同祖先的时候,说明就有回路。

     这题有三点要注意:1、格式问题。题目说的“每两组数据之间有一个空行。”是会PE的!!实际上输出Yes或No之后加多个\n即可,不需要再画蛇添足再输多一个换行。  2、 当整数对列表只有0 0 时,要输出Yes   3、当不相交的集合个数>=2时,也是不符合条件的,要输出No

     

1 #include
2 #include
3 #include <string.h>
4 using namespace std;
5
6 const int maxn &#61; 100000 &#43; 5;
7 int set[maxn], flag[maxn];
8 int sign;
9
10 int find_set(int x)
11 {
12 while (x !&#61; set[x])
13 x &#61; set[x];
14 return x;
15 }
16
17 void union_set(int x, int y)
18 {
19 int fx &#61; find_set(x);
20 // printf("fx &#61; %d\n", fx);
21 int fy &#61; find_set(y);
22 // printf("fy &#61; %d\n", fy);
23 if (fx !&#61; fy)
24 {
25 set[fx] &#61; fy;
26 // printf("set[%d] &#61; %d\n", fx, set[fx]);
27 }
28 else
29 sign &#61; 1;
30 }
31
32 int main()
33 {
34 int a, b, i, j, cnt;
35 memset(set, 0, sizeof(set));
36 memset(flag, 0, sizeof(flag));
37 i &#61; sign &#61; 0;
38 while (scanf("%d%d", &a, &b) && (a !&#61; -1 || b !&#61; -1))
39 {
40 if (i &#61;&#61; 0 && a &#61;&#61; 0 && b &#61;&#61; 0) // i &#61; 0代表列表中的数据是第一组
41 {
42 printf("Yes\n");
43 }
44 else if (a !&#61; 0 && b !&#61; 0)
45 {
46 i&#43;&#43;;
47 if (!flag[a] && set[a] !&#61; a) // flag的作用是输入数据时当存在多个相同的数据时&#xff0c;保证只需要存入一次set[a]&#xff0c;起到类似监视哨的作用
48 {
49 set[a] &#61; a;
50 flag[a] &#61; 1;
51 // printf("set[%d] &#61; %d\n", a, set[a]);
52 }
53 if (!flag[b] && set[b] !&#61; b)
54 {
55 set[b] &#61; b;
56 flag[b] &#61; 1;
57 // printf("set[%d] &#61; %d\n", b, set[b]);
58 }
59 if (a > b)
60 swap(a, b); // 保证小的数指向的祖先比它大,其实这个判断不要也行
61
union_set(a, b); // 合并a、b元素&#xff0c;使a、b成为一个集合
62 }
63 else
64 {
65 for (cnt &#61; 0, j &#61; 1; j )
66 if (set[j] &#61;&#61; j) // 统计不相交集合个数
67 cnt&#43;&#43;;
68 if (cnt > 1) // 不相交集合个数超过1个
69 sign &#61; 1;
70 if (sign)
71 printf("No\n");
72 else
73 printf("Yes\n");
74 memset(set, 0, sizeof(set));
75 memset(flag, 0, sizeof(flag));
76 i &#61; sign &#61; 0;
77 }
78 }
79 return 0;
80 }

 

    

    

    

    

转:https://www.cnblogs.com/windysai/p/3254941.html



推荐阅读
  • 丽江客栈选择问题
    本文介绍了一道经典的算法题,题目涉及在丽江河边的n家特色客栈中选择住宿方案。两位游客希望住在色调相同的两家客栈,并在晚上选择一家最低消费不超过p元的咖啡店小聚。我们将详细探讨如何计算满足条件的住宿方案总数。 ... [详细]
  • 本文深入探讨了POJ2762问题,旨在通过强连通分量缩点和单向连通性的判断方法,解决有向图中任意两点之间的可达性问题。文章详细介绍了算法原理、实现步骤,并附带完整的代码示例。 ... [详细]
  • 编程挑战:2019 Nitacm 校赛 D 题 - 雷顿女士与分队(高级版)
    本文深入解析了2019年Nitacm校赛D题——雷顿女士与分队(高级版),详细介绍了问题背景、解题思路及优化方案。 ... [详细]
  • 本题探讨了在一个有向图中,如何根据特定规则将城市划分为若干个区域,使得每个区域内的城市之间能够相互到达,并且划分的区域数量最少。题目提供了时间限制和内存限制,要求在给定的城市和道路信息下,计算出最少需要划分的区域数量。 ... [详细]
  • 本文探讨了在C++中如何有效地清空输入缓冲区,确保程序只处理最近的输入并丢弃多余的输入。我们将介绍一种不阻塞的方法,并提供一个具体的实现方案。 ... [详细]
  • 本文介绍如何在 C++ 中使用链表结构存储和管理数据。通过具体示例,展示了静态链表的基本操作,包括节点的创建、链接及遍历。 ... [详细]
  • 本问题探讨了在特定条件下排列儿童队伍的方法数量。题目要求计算满足条件的队伍排列总数,并使用递推算法和大数处理技术来解决这一问题。 ... [详细]
  • 本文详细介绍了C++中map容器的多种删除和交换操作,包括clear、erase、swap、extract和merge方法,并提供了完整的代码示例。 ... [详细]
  • Java 中的月减()方法 ... [详细]
  • 本文介绍了Linux系统中的文件IO操作,包括文件描述符、基本文件操作函数以及目录操作。详细解释了各个函数的参数和返回值,并提供了代码示例。 ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • 本文探讨了在使用Selenium进行自动化测试时,由于webdriver对象实例化位置不同而导致浏览器闪退的问题,并提供了详细的代码示例和解决方案。 ... [详细]
  • JavaScript 基础语法指南
    本文详细介绍了 JavaScript 的基础语法,包括变量、数据类型、运算符、语句和函数等内容,旨在为初学者提供全面的入门指导。 ... [详细]
  • 本题旨在通过给定的评级信息,利用拓扑排序和并查集算法来确定全球 Tetris 高手排行榜。题目要求判断是否可以根据提供的信息生成一个明确的排名表,或者是否存在冲突或信息不足的情况。 ... [详细]
  • 本文探讨了使用C#在SQL Server和Access数据库中批量插入多条数据的性能差异。通过具体代码示例,详细分析了两种数据库的执行效率,并提供了优化建议。 ... [详细]
author-avatar
小乐的孤独人生_298
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有