我正在编写一个代码来查找图表的K级连接
G = (V,E).
如果图G
中任意两个随机选择的顶点之间至少有两条不相交的路径,则该图称为2级连接。
当图形很小(顶点数量较少)时,DFS或任何搜索都会占用少量时间,但在处理大型图形(如100个顶点)时,搜索技术将占用大量时间和内存。
以下是我用来查找使用Java的连接级别的代码:
public static List<List<Integer>> list_of_all_path; // record all the paths of the graph
public static int connectivity_level_CR(Graph g) {
list_of_all_path = new ArrayList<List<Integer>>();
int minimum_level = 10000000; // high number
for (int z = 0; z < vNumber; z++) {
for (int l = 0; l < vNumber; l++) {
if (z != l) {
g.printPaths(z, l);
if (listOfLists.size() < minimum_level) {
minimum_level = listOfLists.size(); // record the minimum number of paths between two nodes
}
}
}
}
if (!(is_the_network_connected(g))) minimum_level = 0; // if the network is disconnected, the connectivity level is zero
return minimum_level;
}
public void printPaths(int s, int d) {
listOfLists.clear();
Boolean[] visited = new Boolean[vNumber];
Integer[] path = new Integer[vNumber];
int path_index = 0;
count_paths = 0;
for (int i = 0; i < vNumber; i++) {
visited[i] = false;
}
printPathsUtil(s, d, visited, path, path_index);
}
//find the paths in the graph
int count_paths = 0;
public void printPathsUtil(int s, int d, Boolean[] visited, Integer[] path, int path_index) {
visited[s] = true;
path[path_index] = s;
path_index++;
if (s == d) {
//List<Integer> intList = Arrays.asList(path);
//listOfLists.add(intList);
List<Integer> path_of = new ArrayList<Integer>();
for (int i = 0; i < path_index; i++) {
//System.out.print(path[i] + " ");
path_of.add(path[i]);
}
listOfLists.add(path_of);
//list_of_all_path.add(path_of);
//System.out.println();
} else {
ArrayList<Integer> list = adj[s];
for (Integer i : list) {
if (!visited[i])
printPathsUtil(i, d, visited, path, path_index);
}
}
path_index--;
visited[s] = false;
}
代码已知且存在于互联网上。代码只是依次选择其中一个节点V
,并开始搜索和计算所有路径。因此,代码将返回处于K连接级别的任意两个随机节点之间的最小数量的不相交路径。
我的问题是:
如上图所示,搜索方法不适合大图, 那么有没有任何方法,代码或数学理论可以用少量的时间和内存返回大图的K连接级别?
假设大图包含100个顶点并且是强连接的,这意味着它至少具有2级连接。