参看资料:https://blog.csdn.net/u013480600/article/details/44131453
https://blog.csdn.net/u013480600/article/details/20799843
给你一个N*M的矩阵,由下面11种格子组成,每个格子互联的部分不同(比如A如果放在C正下面,那么A与C是连通的),问你所给矩阵一共有几个连通分量。
具体组合后图形的例子如下图:
Figure2有3个连通分量
分析:
【即两相邻元素是否连通要再判断两元素内部相连的情况,即A-K这11种元素内部的“接口方向”需要记录一下;
且最大的不同是,标识一个元素需要x,y两个变量,与以往的只用编号(一维)的存储方式不同,查找标记元素的方式也会不同】
从上到下,从左到右一次遍历每一个格子。如果当前格子的上(下左右)方还有另一个格子且它们在交界处相连,那么就合并这两个格子所属的连通分量。
合并连通分量时可以用一维的并查集,也可以用二维的并查集代码。AC代码(新)中就是用的二维的并查集代码,这样我们就省得将矩阵的每个格子映射到一个整数上了。同理我们可以用类似的方式处理3维到n维的类似连通分量问题。
最终可以计算出一共有多少连通分量。
https://blog.csdn.net/u013480600/article/details/20806171
现在手上有一些化合物,每个化合物都不相同且由两个不同整数构成,当你手上存在这种情况时:
手上有至少N(N>2)个化合物且其中有N个化合物正好包含N个不同的整数(即这N个整数每个出现了2次)。那么此时化合物不稳定。比如你有化合物(1,2),(2,3),(3,1)那么就是不稳定的,但是你如果只有(1,2),(2,3) 那么就是稳定的。
现在给出所有化合物给你的顺序,你要保证不会出现化合物不稳定的情况,输出你需要拒绝化合物的个数。
分析:
【没太明白究竟是个什么意思,是否是每个元素都必须两个吗?还是只要有一对出现了两次就不满足条件?我按后者理解的,那么就是已有的集合中,我加一条路,结果两端的点都在该集合中,那不就是成圈了?成圈就不满足条件】
把每个整数看成是节点,对应的化合物看成对应的边,那么就形成了一个无向图。
图中有环 充要条件 化合物不稳定(想想是不是)。
我们添加某个化合物会不稳定 充要条件是 该化合物的两种元素已经属于同一个连通分量了(仔细想想是不是)。
如果加入化合物(i, j)后不稳定 --> i与j之间(未加入该化合物时)已经连通了 --> i与j属于同一连通分量。
i与j属于同一连通分量 --> i与j之间有一条路 --> 添加化合物(i, j)后i与j将形成一个环 --> 不稳定。
所以当我们判断化合物的两种元素已经在同一个连通分量时,直接拒绝即可。
本题需小心处理输入数据的输入格式。
https://blog.csdn.net/u013480600/article/details/20837219
某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?
分析:
只需要求出最终剩余的连通分量数目ans即可,然后需要建的道路数目为 ans-1 .
https://blog.csdn.net/u013480600/article/details/20840779
上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走。但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了房间A和B,那么既可以通过它从房间A走到房间B,也可以通过它从房间B走到房间A,为了提高难度,小希希望任意两个房间有且仅有一条路径可以相通(除非走了回头路)。小希现在把她的设计图给你,让你帮忙判断她的设计图是否符合她的设计思路。比如下面的例子,前两个是符合条件的,但是最后一个却有两种方法从5到达8。
分析:
【判断任意两点之间有且只有一条道路,即已连通的两点是否有多余的边相连,即是否存在一条边的两个端点都在同一个集合中】
如果给的图是一个树(且输入中不能有重复边输入。如果有,也应该输出No),那么输出Yes,否则输出No。
一个树满足下面两个条件:只有1个连通分量且任意两点间不存在两条路。
判断任意两点间是否存在两条路只要看已经连通的两点是否还会插入另外一条边进去?
注意:对于输入数据0 0需要特殊判断。
https://blog.csdn.net/u013480600/article/details/20968199
一个数据结构是一颗"树",它要么是一个空要么是满足下面特性的结构:
1. 只有一个根节点,这儿根节点没有入度.
2. 除了这个根节点其他所有的节点都只有一个入边(指向它的边).
3. 从根节点到任意其他的节点有且仅有一条路
现在给你一颗树的所有有向边,然后问你这个树是不是一颗合法的树.
输入:多组实例,最后以-1,-1结尾.每个实例包含一对对的整数,以0 0 表示结尾.
输出:判断是否构成合法的树.
分析:
【记录所有出现过的节点的入度数目并且计算最终的连通分量数目】
仔细分析一下,上面3个条件与下面的两个条件等价:
1.对于所有节点构成的有向图来说 只有1个入度为0且其他节点入度都为1
2.对于所有边构成的无向图来说 只有1个连通分量
所以我们只需要记录所有出现过的节点的入度数目并且计算最终的连通分量数目就可以判断该图形是否是一个树。
注意下面的特例输入:
0 0 (是树)
以及
1 1, 2 3, 3 4, 4 2, 0 0. (入度不符合要求 且 有两个连通分量且 不是树)
以及
1 5, 2 3, 3 4, 4 2, 0 0. (入度符合要求 但是有两个分量 不是树)
https://blog.csdn.net/u013480600/article/details/21077421
二维平面有N台坏的电脑,给出所有电脑的坐标(X,Y)。然后给出2种指令:
O U 指令表示修复编号为U的电脑(电脑只有被修复之后才能进行数据连接)。
S U V 指令要求你返回 编号U电脑和 编号V电脑是否可以进行数据连接(只有U和V电脑同时被修复且连通才行)。
现在给出一个距离d,只有两台被修复的电脑且他们之间的距离<=d时才可以进行连通。且如果A与C连通,C与B连通,那么A与B可以通过C连通(也算A与B连通了)。
现在要你回答每一条S U V指令,如果U与V连通,输出SUCCESS ,否则输出FAIL。
分析:
【预处理任意一点周围允许范围内可连接的点的编号,当修复一点时,遍历其可达到的点,若另一点也已经修复,则连接两点】
每修复一台电脑,就把它 与 所有距离它不超过D且已经被修复的电脑连通(即合并两者的连通分量)。每次查询只需要看被查询的两台电脑是否被修复且都在同一个连通分量即可。
现在问题就是如何快速的知道任何一个点附近距离它不超过D的所有其他点?
预处理:用两个for来遍历每一个点,求他们之间的距离。用vector[i]保存每个与i距离不超过D距离的顶点编号.(点编号从1到N)
https://blog.csdn.net/u013480600/article/details/21097167
给你n个节点(节点编号1到n)和m条边,然后问你无向图有多少个连通分量.
分析:
【在连接边时,有效连接 连通分量减一,无效连接连通分量不变】
初始连通分量有n个。每读入一条边,如果这条边的两个点不在一个连通分量,那么合并两点所属的连通分量。总的连通分量数目就减少1。
输出最终剩余连通分量数目即可。