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

poj2421ConstructingRoads解题报告

题目链接:http:poj.orgproblem?id2421实际上又是考最小生成树的内容,也是用到kruskal算法。但稍稍有点不同的是,


题目链接:http://poj.org/problem?id=2421


        实际上又是考最小生成树的内容,也是用到kruskal算法。但稍稍有点不同的是,给出一些已连接的边,要在这些边存在的情况下,拓展出最小生成树来。


       一般来说,过到这四组数据大体上就能AC了。  1、题目给出的案例数据    2、连接的道路可能把所有的村庄都已经连通了       3、两个村庄给出多次,即连接这两个村庄的道路是重复的!。 


2、3这两种情况的数据如下(为了好看,自己出了一组,当然Sample Input 那组也行):


情况2(所有村庄已连通):                   情况3:


       还有第4种情况:



1 #include
2 #include
3 using namespace std;
4
5 const int maxe = 10000 + 10; // 这里开小点也行,因为只存储矩阵不够一半的数据
6 int rep[maxe], vis[maxe];
7
8 struct sets
9 {
10 int v1, v2;
11 int value;
12 } exa[maxe];
13
14 int cmp(sets a, sets b)
15 {
16 return a.value < b.value;
17 }
18
19 int find(int x)
20 {
21 return x &#61;&#61; rep[x] ? x : find(rep[x]);
22 }
23
24 int main()
25 {
26 int i, j, n, a, b, x, y, t, cnt, flag;
27 while (scanf("%d", &n) !&#61; EOF)
28 {
29 for (i &#61; 1; i <&#61; n; i&#43;&#43;)
30 {
31 rep[i] &#61; i;
32 }
33 cnt &#61; 0;
34 for (i &#61; 1; i <&#61; n; i&#43;&#43;)
35 {
36 for (j &#61; 1; j <&#61; n; j&#43;&#43;)
37 {
38 scanf("%d", &a);
39 if (i // 只存储上三角矩阵
40 {
41 exa[cnt].v1 &#61; i;
42 exa[cnt].v2 &#61; j;
43 exa[cnt].value &#61; a;
44 cnt&#43;&#43;;
45 }
46 }
47 }
48 sort(exa, exa&#43;cnt, cmp); // 对长度进行从小到大排序
49 flag &#61; 0;
50 memset(vis, 0, sizeof(vis));
51 scanf("%d", &t);
52 while (t--)
53 {
54 scanf("%d%d", &a, &b);
55 if (a > b)
56 swap(a, b); // 刚开始就保持小的元素的祖先是大的元素
57 x &#61; find(a);
58 y &#61; find(b);
59 if (x > y)
60 {
61 swap(x, y); // 合并集合的时候&#xff0c;有可能使得大的元素的祖先变成了是比它小的元素
62 }
63 if (vis[a] && vis[b]) // 两个村庄在之前已经被访问过&#xff0c;这是为了处理情况4的情况的
64 rep[x] &#61; y;
65 else
66 {
67 if (x &#61;&#61; y) // 所有村庄都有路可通
68 flag &#61; 1;
69 if (!vis[a] && !vis[b])
70 {
71 rep[x] &#61; y;
72 vis[a] &#61; vis[b] &#61; 1;
73 }
74 else if (!vis[a])
75 {
76 rep[x] &#61; y;
77 vis[a] &#61; 1;
78 }
79 else if (!vis[b])
80 {
81 rep[x] &#61; y;
82 vis[b] &#61; 1;
83 }
84 }
85 }
86 if (!flag)
87 {
88 int minval &#61; 0;
89 for (i &#61; 0; i )
90 {
91 x &#61; find(exa[i].v1);
92 y &#61; find(exa[i].v2);
93 if (x !&#61; y)
94 {
95 minval &#43;&#61; exa[i].value;
96 if (x < y) // 为了与前面相一致&#xff0c;也是小的元素的祖先是大的元素
97 rep[x] &#61; y;
98 else
99 rep[y] &#61; x;
100 }
101 }
102 printf("%d\n", minval);
103 }
104 else
105 printf("0\n");
106 }
107 return 0;
108 }


       其实&#xff0c;还有一种比较简单的方法&#xff0c;但是目前还不会实现。Dwylkz给的解法&#xff1a;题目给的已连通的村庄的value都设为0。感觉这样会少讨论很多情况&#xff0c;希望以这种方法过了的读者可以指点一下&#xff0c;好像在上面的代码修改比较难实现。


 


转载于:https://www.cnblogs.com/windysai/p/3313815.html



推荐阅读
  • 本文介绍如何利用栈数据结构在C++中判断字符串中的括号是否匹配。通过顺序栈和链栈两种方式实现,并详细解释了算法的核心思想和具体实现步骤。 ... [详细]
  • 探讨ChatGPT在法律和版权方面的潜在风险及影响,分析其作为内容创造工具的合法性和合规性。 ... [详细]
  • 本文探讨了如何通过预处理器开关选择不同的类实现,并解决在特定情况下遇到的链接器错误。 ... [详细]
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • Linux环境下C语言实现定时向文件写入当前时间
    本文介绍如何在Linux系统中使用C语言编程,实现在每秒钟向指定文件中写入当前时间戳。通过此示例,读者可以了解基本的文件操作、时间处理以及循环控制。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • CSS高级技巧:动态高亮当前页面导航
    本文介绍了如何使用CSS实现网站导航栏中当前页面的高亮显示,提升用户体验。通过为每个页面的body元素添加特定ID,并结合导航项的类名,可以轻松实现这一功能。 ... [详细]
  • 本文详细解释了为什么在成功执行移动赋值操作后,对象的析构函数会被调用,并提供了代码示例和详细的分析。 ... [详细]
  • 二叉树的链表实现
    本文介绍了一种使用链表结构表示二叉树的方法。通过定义节点结构和相关操作函数,可以方便地创建、插入和遍历二叉树。 ... [详细]
  • 本文介绍了一种基于选择排序思想的高效排序方法——堆排序。通过使用堆数据结构,堆排序能够在每次查找最大元素时显著提高效率。文章详细描述了堆排序的工作原理,并提供了完整的C语言代码实现。 ... [详细]
  • Linux环境下进程间通信:深入解析信号机制
    本文详细探讨了Linux系统中信号的生命周期,从信号生成到处理函数执行完毕的全过程,并介绍了信号编程中的注意事项和常见应用实例。通过分析信号在进程中的注册、注销及处理过程,帮助读者理解如何高效利用信号进行进程间通信。 ... [详细]
  • #print(34or4 ... [详细]
  • 本文将探讨2015年RCTF竞赛中的一道PWN题目——shaxian,重点分析其利用Fastbin和堆溢出的技巧。通过详细解析代码流程和漏洞利用过程,帮助读者理解此类题目的破解方法。 ... [详细]
  • 深入解析ESFramework中的AgileTcp组件
    本文详细介绍了ESFramework框架中AgileTcp组件的设计与实现。AgileTcp是ESFramework提供的ITcp接口的高效实现,旨在优化TCP通信的性能和结构清晰度。 ... [详细]
  • 深入解析Java多线程与并发库的应用:空中网实习生面试题详解
    本文详细探讨了Java多线程与并发库的高级应用,结合空中网在挑选实习生时的面试题目,深入分析了相关技术要点和实现细节。文章通过具体的代码示例展示了如何使用Semaphore和SynchronousQueue来管理线程同步和任务调度。 ... [详细]
author-avatar
我才不要喜欢你了
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有