算法练习_图的连通性问题(JAVA)
一.问题
1.问题描述:
有n个点(1...n),输入整数对(8,9),表示8,9点之间存在相互的连接关系。
动态连通性问题--编写一段程序过滤掉所以无意义的整数对,即为在不破坏图连通性的前提下,以最简单的方式表示图的连通性。2.实现方案:设计数据结构保存已经存在的整数对,并且用他们来判断新数对是否满足新相连关系。
3.实例应用:网络连接问题,电子触电设计,社交网络关系等等
二.解决
1.定义问题--设计api
public class UF//(类名大写) | ||
(构造方法) | UN(int N) | 初始化0-N个触点 |
void | union(int p,int q) | 在两点之间建立连接 |
int | find(int p) | 在触点集中找到p |
boolean | connected(int p,int q) | 判断触点p,q是否相连 |
int | count() | 连通分量的计数 |
2.方案设计
<一>两个变量
count--用于连通分量的计数&&id[]--数组下标表示连通分量
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
初始化时下标默认为自身下标
在输入连通关系后(3,4),(5,6)
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
0 | 1 | 2 | 4 | 4 | 6 | 6 | 7 | 8 | 9 |
将所以id[3]相同的下标修改为id[4]
从而表示数组的相连关系
1.quick-find
public int find(int p){
return id[p];
}
//对两点进行连接
public void union(int p,int q){ int pid=find(p);
int qid=find(q); if(pid==qid)return;//直接return用于方法的推出 for(int i=0;i<id.length;i++)
if(id[i]==pid)id[i]=qid; count--;
}
每次union需要访问数组(N+3)到(2N+1)次
2.quick-union
private int find(int p){
while(p!=id[p]){//找出根结点
p=id[p];
}
return p;
}
private void union(int p,int q){
int prot=find(p);
int qrot=find(q);
if(qrot==prot)return;
id[qrot]=prot;
count--;
}
3.union-find算法,加权
public class UF { private int[] id;
private int[] sz;
private int count; //初始化
public UF(int N){
count=N;
id=new int[N];
sz=new int[N];
for(int i=0;i<N;i++){
id[i]=i;
sz[i]=1;
}
} private int find(int p){
while(p!=id[p]){//找出根结点
p=id[p];
}
return p;
}
private void union(int p,int q){
int i=find(p);
int j=find(q); if(i==j)return;
if(sz[i]<sz[j]){
id[i]=j;sz[j]+=sz[i];
}else{
id[j]=i;sz[i]+=sz[j];
}
count--;
} //对联通分量进行计数
public int count(){return count;} //判断是否连接
public boolean connected(int p,int q){
return find(p)==find(q);
}
}
算法练习_图的连通性问题(JAVA)的更多相关文章
- java数据结构_笔记(5)_图的算法
图的算法 1 图的遍历图的遍历就是从图中某个顶点出发,按某种方法对图中所有顶点访问且仅访问一次.遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础. 2 深度优先遍历从图中某个顶点V 出发 ...
- 数据结构-图-Java实现:有向图 图存储(邻接矩阵),最小生成树,广度深度遍历,图的连通性,最短路径1
import java.util.ArrayList; import java.util.List; // 模块E public class AdjMatrixGraph<E> { pro ...
- Kosaraju 算法检测有向图的强连通性
给定一个有向图 G = (V, E) ,对于任意一对顶点 u 和 v,有 u --> v 和 v --> u,亦即,顶点 u 和 v 是互相可达的,则说明该图 G 是强连通的(Strong ...
- Tarjan算法:求解图的割点与桥(割边)
简介: 割边和割点的定义仅限于无向图中.我们可以通过定义以蛮力方式求解出无向图的所有割点和割边,但这样的求解方式效率低.Tarjan提出了一种快速求解的方式,通过一次DFS就求解出图中所有的割点和割边 ...
- Victoria的舞会2——图的连通性及连通分量
[Vijos1022]]Victoria的舞会2 Description Victoria是一位颇有成就的艺术家,他因油画作品<我爱北京天安门>闻名于世界.现在,他为了报答帮助他的同行们, ...
- 算法基础_递归_求杨辉三角第m行第n个数字
问题描述: 算法基础_递归_求杨辉三角第m行第n个数字(m,n都从0开始) 解题源代码(这里打印出的是杨辉三角某一层的所有数字,没用大数,所以有上限,这里只写基本逻辑,要符合题意的话,把循环去掉就好) ...
- 从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射
从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射.Collection 接口又有 3 ...
- 图的连通性问题的小结 (双连通、2-SAT)
图的连通性问题包括: 1.强连通分量. 2.最小点基和最小权点基. 3.双连通. 4.全局最小割. 5.2-SAT 一.强连通分量 强连通分量很少单独出题,一般都是把求强连通分量作为缩点工具. 有三种 ...
- POJ 2513 - Colored Sticks - [欧拉路][图的连通性][字典树]
题目链接: http://poj.org/problem?id=2513 http://bailian.openjudge.cn/practice/2513?lang=en_US Time Limit ...
随机推荐
- python基础补漏-02-collection
collection系列 [1]计数器 Counter import collections res = collections.Counter("34234sdfgs45tsaf1&quo ...
- js中类型识别的方法
第一种方法typeof typeof是一种运算符,它的值有以下几种 <!DOCTYPE html> <html lang="en"> <head> ...
- CSS实例练习
蓝色导航为图片,用background-image实现. 排版用到ul,li标签,下划线运用border-bottom中的dashed,右边文字用到CSS浮动float. 实例: 代码: <!D ...
- c#上级目录
本文实例讲述了C#的path.GetFullPath 获取上级目录实现方法,分享给大家供大家参考.具体实现方法如下: string path = new directoryinfo("../ ...
- TYVJ1035 棋盘覆盖
时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 给出一张n*n(n<=100)的国际象棋棋盘,其中被删除了一些点,问可以使用多少1*2的多米诺骨牌进行掩 ...
- 5806 NanoApe Loves Sequence Ⅱ(尺取法)
传送门 NanoApe Loves Sequence Ⅱ Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/131072 K ...
- 在Python中使用可变长参数列表
函数定义 在函数定义中使用*args和**kwargs传递可变长参数. *args用作传递非命名键值可变长参数列表(位置参数); **kwargs用作传递键值可变长参数列表 函数调用 在调用函数时,使 ...
- Hibernate--------八大类HQL查询集合
Hibernate的 八大类HQL查询集合 Hibernate的八大类HQL查询集合: 一:属性查询(SimplePropertyQuery) 1,单一属性查询 *返回结果集属性列表,元素类型和实 ...
- JSON资料整理
http://www.cnblogs.com/zxlovenet/p/3566802.html
- windows 下的sleep 命令
方法一 ping -n 3 127.0.0.1 > nul 其中3是需要sleep的秒数 方法二 timeout /t 3 /nobreak > nul 其中3是需要sleep的秒数