连通性问题

参考:Robert Sedgewick,《算法:C语言实现》第1章


问题描述

假设给定整数对的一个序列,其中每个整数表示某类型的一个对象,我们想要说明整数对p-q表示“p连接到q”。假设“连通”关系是可传递的:也就是说如果p和q之间连通,q和r之间连通,那么p和r也是连通的。我们的目标是写一个过滤集合中的无关对的程序。程序的输入为整数对p-q,如果已经看到的数对中并不隐含这p连通到q,那么就输出该对。如果前面输入大数对中隐含着p连通到q,那么程序应该忽略p-q,并应该继续输入下一对。如图1-1给出来一个输入输出示例。

我们的问题是设计能够记录足够多它所看见大数对信息的程序,并能够判断一个新的数对是否是连通的。非形式地,我们称设计这样一个算法的任务叫做连通性问题

这里,我们首先假设有N个对象,每个对象都与0N-1之间大一个整数名对应。

由图论的基本结果可以得出结论:所有N个对象是连通的,当且仅当连通算法输出的数对的个数恰好为N-1个。

努力确定算法的基本操作很重要,这使我们为连通性问题设计的算法可以用于许多类似大问题。确切的说,当我们得到一个新对时,我们必须首先确定它是否表示一个新的连接,然后把已经看到的连接信息合并到已得到的对象的连通关系中,使得它能够检查将要看到的连接。我们把这两个任务封装成“查找”和“合并”两个抽象操作,根据这两个操作很容易求解连通性问题。

在从输入中读取一个新的整数对p-q后,对于数对中的每一个数执行查找操作,如果对的成员在同一个集合中,说明它们是连通的,那么考虑下一对;如果它们不在同一个集合中,则执行合并操作,并输出这个对。



1
合并-查找算法

开发求解给定问题高效算法大过程中,第一步是实现这个问题的一个简单算法。如果我们需要解决几个容易的特定问题的实例,那么,简单实现就能完成这项工作。如果要用更复杂的算法,简单实现可以用于检查小规模例子的正确性,并成为评估算法性能的一个基准。我们总是关注算法的效率,但我们在开发解决问题的第一个程序时,更关注的是确保程序的正确性。

  首先考虑如何存储所有输入对,然后写一个遍历这些输入的函数,然后检查下一个数对是否是连通的。我们会选用另外一种方法。首先,实际应用中数对的个数可能很大,不能把它们全部放在内存中。其次,更重要的是,即使我们能够把它们放在内存中,也没有一种简单大方法能够由连接关系集合很快地确定两个对象是否连通。在这里我们首先考虑一种简单大方法,因为它们可以求解难度更小大问题,且这些方法不要求村村所有对,因而是更高效的方法。这些方法利用整数数组,每个整数对应一个对象,用于保存实现合并和查找操作时所需要大必要信息。

  程序1.1是求解连通性问题大“快速-查找算法”(quick-find algorithm)的一种简单实现。算法的基础是一个整数数组,当且仅当第p个元素值与第q个元素的值相等时,说明p和q是连通的。初始化时,先设置第i个元素的值为i,其中0<=i<=N。为了实现p与q的合并操作,我们遍历数组,把所有取值与p元素值相同的元素值改为q,即表示把新对象q加入到之前p对象所在的组(q作为这个组所有对象的新根节点)。同样,我们也可以选择另一种方式,把所有取值为q的元素值改为p,道理是一样的。

  这个程序从标准输入读取小于N的非负整数对序列(数对p-q表示“把p所在连通集合中的所有对象连接到对象q”),并且输出还未连通的输入对。程序中使用数组id,每个元素表示一个对象,且具有如下性质,当且仅当p和q是连通的,id[p]=id[q]。为简化起见,定义N为编译时的常数。另一方面,也可以从输入得到它,并动态地分配id数组。

时间: 2024-10-13 02:25:31

连通性问题的相关文章

hihocoder #1190 : 连通性&#183;四 点双联通分量

http://hihocoder.com/problemset/problem/1190?sid=1051696 先抄袭一下 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho从约翰家回到学校时,网络所的老师又找到了小Hi和小Ho. 老师告诉小Hi和小Ho:之前的分组出了点问题,当服务器(上次是连接)发生宕机的时候,在同一组的服务器有可能连接不上,所以他们希望重新进行一次分组.这一次老师希望对连接进行分组,并把一个组内的所有连接关联的服务器也视为这个组内

天梯赛 L2-013. 红色警报 图的连通性

L2-013. 红色警报 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 战争中保持各个城市间的连通性非常重要.本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报.注意:若该国本来就不完全连通,是分裂的k个区域,而失去一个城市并不改变其他城市之间的连通性,则不要发出警报. 输入格式: 输入在第一行给出两个整数N(0 < N <=500)和M(<=5000),分别为城市个数(

Java测试网络连通性

第一种方式:利用java运行时: Java代码   /** * test network * @param ip */ private void getNetworkState(String ip) { Runtime runtime = Runtime.getRuntime(); try { log.info("=================正在测试网络连通性ip:"+ip); Process process = runtime.exec("ping " +i

第48套题【tarjan】【图&amp;树的连通性】【并查集】

Problem 1 图的连通性??题目背景??琼和雪不知从什么时候就开始形影不离得呆在一起,无话不说了那天她们在谈论图论??题意描述??“有一个无向图,每次断掉一条边,并询问两个点时候联通,你会维护么?” 琼很认真地问.“为什么要知道这个呢?”“我们总要知道自己是否身陷囹囵……你必须立刻告诉我答案哦”??输入格式??测试数据的第一行是三个正整数n.m.t, 表示无向图有n 个点,m 条边和t 个操作接下来m 行,每行两个正整数x.y,表示x 和y 之间有一条边(允许存在重边)接下来t 行,每行三

POJ2513(字典树+图的连通性判断)

//用map映射TLE,字典树就AC了#include"cstdio" #include"set" using namespace std; const int MAXN=510005; const int N=26;//26个小写英文字母 struct node{ int val;//存放字符串的hash值 node* next[N]; }; node memory[MAXN]; int ant; node* root; node* create_tree() {

hihoCoder_#1184_连通性二&#183;边的双连通分量

#1184 : 连通性二·边的双连通分量 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在基本的网络搭建完成后,学校为了方便管理还需要对所有的服务器进行编组,网络所的老师找到了小Hi和小Ho,希望他俩帮忙. 老师告诉小Hi和小Ho:根据现在网络的情况,我们要将服务器进行分组,对于同一个组的服务器,应当满足:当组内任意一个连接断开之后,不会影响组内服务器的连通性.在满足以上条件下,每个组内的服务器数量越多越好. 比如下面这个例子,一共有6个服务器和7条连接: 其中包

Windows批处理:自动检查网络连通性

检测网络连通性我用的是丛远到近的方法,即"外网--网关--内网--本机",脚本的实现也是根据这个顺序用ping来检测,为提高检测速度,这里我只ping了2次,各位可以根据自己的需要进行修改. 使用方法大神们都会的... 复制代码,另存为.bat文件后执行. @echo off color 2F title 网络连通性检测 echo. echo. ping -n 2 223.5.5.5>%temp%\1.ping & ping -n 2 223.6.6.6>>%

Windows批处理:自动检查服务器连通性

该技术与上一篇<自动检查网络连通性>的实现原理相同,我将脚本稍微改动了下,用于检查公司服务器的连通性,简单快捷.在这里附上修改方法. @echo off color 1F title 服务器连通检测 echo. ping -n 2 192.168.1.11>%temp%\1.ping ::ping的地址修改后,每添加一个条目,临时文件1.ping需改名,如2.ping findstr "TTL" %temp%\1.ping>nul ::每添加一个条目,临时文件1

49. 蛤蟆的数据结构笔记之四十九图的连通性问题

49. 蛤蟆的数据结构笔记之四十九图的连通性问题 本篇名言:"我们不得不饮食.睡眠.游惰.恋爱,也就是说,我们不得不接触生活中最甜蜜的事情:不过我们必须不屈服于这些事物 .....--约里奥?居里"     此篇就作为数据结构入门笔记的最后一篇吧. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47135259 设图G=(V,E)是一个无向图,G的一个连通分支是一个最大的连通子图,即一个连通分支是不包含在任何更大的

[hihoCoder] 第五十二周: 连通性&#183;一

题目1 : 连通性·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 还记得上次小Hi和小Ho学校被黑客攻击的事情么,那一次攻击最后造成了学校网络数据的丢失.为了避免再次出现这样的情况,学校决定对校园网络进行重新设计. 学校现在一共拥有N台服务器(编号1..N)以及M条连接,保证了任意两台服务器之间都能够通过连接直接或者间接的数据通讯. 当发生黑客攻击时,学校会立刻切断网络中的一条连接或是立刻关闭一台服务器,使得整个网络被隔离成两个独立的部分. 举个例子,对于以下