一.问题

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)的更多相关文章

  1. java数据结构_笔记(5)_图的算法

    图的算法 1 图的遍历图的遍历就是从图中某个顶点出发,按某种方法对图中所有顶点访问且仅访问一次.遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础. 2 深度优先遍历从图中某个顶点V 出发 ...

  2. 数据结构-图-Java实现:有向图 图存储(邻接矩阵),最小生成树,广度深度遍历,图的连通性,最短路径1

    import java.util.ArrayList; import java.util.List; // 模块E public class AdjMatrixGraph<E> { pro ...

  3. Kosaraju 算法检测有向图的强连通性

    给定一个有向图 G = (V, E) ,对于任意一对顶点 u 和 v,有 u --> v 和 v --> u,亦即,顶点 u 和 v 是互相可达的,则说明该图 G 是强连通的(Strong ...

  4. Tarjan算法:求解图的割点与桥(割边)

    简介: 割边和割点的定义仅限于无向图中.我们可以通过定义以蛮力方式求解出无向图的所有割点和割边,但这样的求解方式效率低.Tarjan提出了一种快速求解的方式,通过一次DFS就求解出图中所有的割点和割边 ...

  5. Victoria的舞会2——图的连通性及连通分量

    [Vijos1022]]Victoria的舞会2 Description Victoria是一位颇有成就的艺术家,他因油画作品<我爱北京天安门>闻名于世界.现在,他为了报答帮助他的同行们, ...

  6. 算法基础_递归_求杨辉三角第m行第n个数字

    问题描述: 算法基础_递归_求杨辉三角第m行第n个数字(m,n都从0开始) 解题源代码(这里打印出的是杨辉三角某一层的所有数字,没用大数,所以有上限,这里只写基本逻辑,要符合题意的话,把循环去掉就好) ...

  7. 从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射

    从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射.Collection 接口又有 3 ...

  8. 图的连通性问题的小结 (双连通、2-SAT)

    图的连通性问题包括: 1.强连通分量. 2.最小点基和最小权点基. 3.双连通. 4.全局最小割. 5.2-SAT 一.强连通分量 强连通分量很少单独出题,一般都是把求强连通分量作为缩点工具. 有三种 ...

  9. POJ 2513 - Colored Sticks - [欧拉路][图的连通性][字典树]

    题目链接: http://poj.org/problem?id=2513 http://bailian.openjudge.cn/practice/2513?lang=en_US Time Limit ...

随机推荐

  1. SQL基础语法(五)

    SQL INSERT INTO 语句INSERT INTO 语句 INSERT INTO 语句用于向表格中插入新的行. 语法:INSERT INTO 表名称 VALUES (值1, 值2,....) ...

  2. iOS dealloc 不被调用的问题

    最近项目中老是无缘无故的出现一下奔溃.查看一下堆栈信息,指针的指向都有,但还是奔溃.所以第一个怀疑出现野指针引起的问题.然后调试代码中的一下dealloc函数.好多对象在释放之后都没掉用.顿时吓出一身 ...

  3. List Map Set 的用法和区别

    参考 http://blog.csdn.net/vstar283551454/article/details/8682655

  4. 解决SmartGit序列号问题

    SmartGit过了30天试用期之后,就需要用户输入序列号才能继续使用,有一个办法可以跳过输入序列号. 一.windows+R  输入:%APPDATA%\syntevo\SmartGit 二.打开7 ...

  5. 初识JVM--java虚拟机的基本知识

    JVM运行时的内存块 pc寄存器:(线程独有)保存线程运行的java方法地址 Java 虚拟接栈(线程独有):用于存储线程的栈帧 Java堆(全局共享):随着Java虚拟机的启动 创建 存储着所有对象 ...

  6. Linux学习(CentOS-7)---磁盘分区(概念、分区方法、分区方案)

    1磁盘分区相关的概念 1.1什么是磁盘 磁盘就是计算机的外部存储器设备,即将圆形的磁性盘片装在一个方的密封盒子里,这样做的目的是为了防止磁盘表面划伤,导致数据丢失.简单地讲,就是一种计算机信息载体,也 ...

  7. linux 下第一个Libevent代码学习

    #include <event.h> struct event ev; struct timeval tv; void time_cb(int fd, short event, void* ...

  8. PHP获取上周、本周、上月、本月、本季度、上季度时间方法大全

    <?php     echo date("Ymd",strtotime("now")), "\n";     echo date(&q ...

  9. windows 64位 安装apache+php+mysql

    1.下载PHP.Apache和Mysql软件以及VC库. 下面分别是PHP.Apache和Mysql的官网地址. PHP:http://windows.php.net/qa/ 注意 选择Thread ...

  10. spring事务传播性与隔离级别

    事务的7种传播级别: 1)PROPAGATION_REQUIRED:支持当前事务,没有事务就新建一个. 2)PROPAGATION_SUPPORTS:支持当前事务,如果没有事务,以非事务方式处理 3) ...