一、图的连通性
(一)、定义
- 请读一遍:
- 对无向图进行遍历时,对于连通图,仅需从图中任一顶点出发,进行深度优先搜索或广度优先搜索,便可访问到图中所有顶点。对非连通图,则需从多个顶点出发进行搜索,而每一次从一个新的起始点出发进行搜索过程中得到的顶点访问序列恰为其各个连通分量中的顶点集。
- 什么是结点的连通性?
- 若图 G 中两个不同的结点 u 和 v 存在路径 e,则称结点 u 和结点 v 连通。
- 什么是图的连通性?
- 若图 G 中任意两个结点连通,则称图 G 连通。
(二)、方法
- DFS :若图能连通,那么比能访问完所有图中节点。
- BFS :若图能连通,那么比能访问完所有图中节点。
- 令邻接矩阵为A,若A + A^2 + A^3 + … + A^(n-1) 不存在非零元素(不考虑对角线),则为连通。
(三)、Java代码
1. 图的连通性检验
public boolean isConnectivity() {
int[][] tempMatrix = new int[vexNum][vexNum];
int[][] tempMultiplyMatrix = new int[vexNum][vexNum];
for (int i = 0; i < vexNum; i++) {
for (int j = 0; j < vexNum; j++) {
tempMatrix[i][j] = 0;
tempMultiplyMatrix[i][j] = arcs[i][j];
}
}
for (int i = 0; i < vexNum - 1; i++) {
tempMatrix = addMatrix(tempMultiplyMatrix, tempMatrix);
tempMultiplyMatrix = multiplyMatrix(tempMultiplyMatrix, arcs);
}
for (int i = 0; i < vexNum; i++) {
tempMatrix[i][i] = 1;
}
for (int i = 0; i < vexNum; i++) {
for (int j = 0; j < vexNum; j++) {
if (tempMatrix[i][j] == 0) {
return false;
}
}
}
return true;
}
2. 源码
package graph;
public class GraphApp extends MGraph {
public GraphApp(int vexMax) {
super(vexMax);
}
public int[][] addMatrix(int[][] Matrix1, int[][] Matrix2) {
int[][] rusultMatrix = new int[Matrix1.length][Matrix2.length];
for (int i = 0; i < Matrix1.length; i++) {
for (int j = 0; j < Matrix2.length; j++) {
rusultMatrix[i][j] = Matrix1[i][j] + Matrix2[i][j];
}
}
return rusultMatrix;
}
public int[][] multiplyMatrix(int[][] Matrix1, int[][] Matrix2) {
int[][] rusultMatrix = new int[Matrix1.length][Matrix2.length];
for (int i = 0; i < Matrix1.length; i++) {
for (int j = 0; j < Matrix2.length; j++) {
for (int k = 0; k < Matrix1.length; k++) {
rusultMatrix[i][j] += Matrix1[i][k] * Matrix2[k][j];
}
}
}
return rusultMatrix;
}
public boolean isConnectivity() {
int[][] tempMatrix = new int[vexNum][vexNum];
int[][] tempMultiplyMatrix = new int[vexNum][vexNum];
for (int i = 0; i < vexNum; i++) {
for (int j = 0; j < vexNum; j++) {
tempMat