查找识别图的子元素(连通子图)是图算法中常用的操作,在现实中有广泛的应用,如欧拉提出的哥尼斯堡七桥问题,或者判断不同地理区域的连通性问题等,实质上都是确定图的子元素的问题。
1. 问题描述
某公司中标了一个扶持贫困山区的道路畅通工程,需要把该地区附近未通车区域的道路进行铺设拓宽,打通整个地区的所有区域,使该地区各村庄之间彻底实现通车。
假设该地区的村庄数为 N,可通车道路数为 M,道路均为双向通车道路。该公司前期在做成本估算时,需要勘察整个区域,根据各个区域的道路连接情况确定需要铺设道路的数量。
给定 N 的取值为 7,分别用 A、B、C、D、E、F 和 G 表示该地区的 7 个村庄;M 取值为 3,具有可通车道路的村庄为 (A,C)、(C,E) 和 (D,F),采用并查集结构求解该公司最少需要铺设的道路的数量。
2. 问题分析
该问题要求解连通任意两村庄所需铺设道路的最少条数,实质上是一个求解无向图的连通子图问题。该图以村庄为节点,以村庄之间的道路为边组成,最终求解的问题是要获取该图的连通子图个数。
若整个图为一个连通子图,即所有节点之间均相互可达,则表示各个村庄之间已经实现相互通车,此时不需要新修道路;若整个图由两个连通子图构成,则表示此区域中有两块子区域之间相互不能通车,此时需要在这两个子区域中修建一条道路即可打通所有村庄之间的通车道路。
以此类推,可以归纳出,若图中有n(n≥1)个连通子图,则至少需要构建n-1条道路,可以实现整个区域的通车。
根据以上分析,首先构建并查集。
1) 在初始阶段,通过 M