求图中某点到另一点的通路

图的搜索方法有DFS和BFS,但是这两个算法不能直接得到(其实是我不会)图中任意一点到另外一点的通路路径,以图中某个点作为起点,另外一点作为终点,从终点开始,利用邻接表,从后向前查找,首先查找可以直接到终点的节点,放入集合S1中,然后再查找可以直接到S1的节点,存入集合S2,只到找到起点为止。代码如下:

 1 public static  void getReachableNodeCollection(){
 2         ArrayList<ArrayList<Integer>> reachableNodeCollection=new ArrayList<ArrayList<Integer>>();
 3         ArrayList<Integer> reachableNode=new ArrayList<>();
 4         ArrayList<Integer> tempNeighbour;
 5         final ArrayList<Integer> keySet=new ArrayList<>();
 6         for (Integer key:neighbourTable.keySet()){
 7             if (!key.equals(demandRouterArray[1]))
 8             {
 9                 keySet.add(key);
10             }
11         }
12         Integer key;
13         tempNeighbour=new ArrayList<>();
14         for (int i = 0; i < keySet.size(); i++) {
15             key=keySet.get(i);
16             tempNeighbour.addAll(neighbourTable.get(key));
17             if ((tempNeighbour.contains(demandRouterArray[1]))){
18                 reachableNode.add(key);
19                 //continue;
20
21             }
22             tempNeighbour.clear();
23
24         }
25         reachableNodeCollection.add(new ArrayList<Integer>(reachableNode));//到最后一个节点的节点集合存在第一个位置,将来获得路径是要逆序访问
26         ArrayList<Integer> copyOfReachableNode;
27         ArrayList<Integer> currentKeySet=new ArrayList<>(keySet);
28         currentKeySet.removeAll(reachableNode);
29         Integer NodeId;
30         copyOfReachableNode=new ArrayList<>();
31         boolean findStartNode=false;
32         Integer startNodeId=demandRouterArray[0];
33         while(currentKeySet.size()>0&&!reachableNode.contains(startNodeId)){
34             copyOfReachableNode.addAll(reachableNode);
35             reachableNode.clear();
36             for (int i = 0; i <currentKeySet.size() ; i++) {
37                 key=currentKeySet.get(i);
38
39                 tempNeighbour.addAll(neighbourTable.get(key));
40                 for (int j = 0; j <copyOfReachableNode.size() ; j++) {
41                     NodeId=copyOfReachableNode.get(j);
42                     if (tempNeighbour.contains(NodeId)){
43                         reachableNode.add(key);
44                         if (key.equals(startNodeId)){
45                             findStartNode=true;//如果已经找到起始点,就跳出搜索
46                         }
47                         break;
48                     }
49                 }
50                 tempNeighbour.clear();
51                 if (findStartNode){
52                     break;
53                 }
54             }
55             reachableNodeCollection.add(new ArrayList<Integer>(reachableNode));
56             currentKeySet.removeAll(reachableNode);
57             copyOfReachableNode.clear();
58             if (findStartNode){
59                 break;
60             }
61         }
62         System.out.println();
63     }

其中,从后向前查找时,首先查找到的节点ID存储在reachableNodeCollection中,如下:

 reachableNodeCollection.add(new ArrayList<Integer>(reachableNode));

由于之后要将reachableNode使用clear()方法清空,所以这里需要使用new创建一个新的ArrayList对象,在新的空间中拷贝了一份reachableNode中的引用,这些引用指向一些Integer对象。如果不是有new创建新对象,而是直接使用如下形式的话

reachableNodeCollection.add(reachableNode));

这里只是将reachableNode的地址添加进来,当reachableNode.clear()之后,reachableNode中的引用被清空,reachNodeCollection自然也找不到原先的Integer内容了。

				
时间: 2024-10-27 11:05:02

求图中某点到另一点的通路的相关文章

Floyd-Warshall求图中任意两点的最短路径

原创 除了DFS和BFS求图中最短路径的方法,算法Floyd-Warshall也可以求图中任意两点的最短路径. 从图中任取两点A.B,A到B的最短路径无非只有两种情况: 1:A直接到B这条路径即是最短路径(前提是存在此路径): 2:A先通过其他点,再由其他点到B. 我们并不知道A是否需要通过其他点间接到达B,所以只能比较,用A到B的直接路径和A先通过其他点 再间接到达B的路径长度进行比较,然后更新为较小值. 上图中若要求顶点4到顶点3的最短路径,可以比较顶点4直接到3的路径和顶点4先到1,再到3

poj 3895 Cycles of Lanes 修改tarjan算法求图中最大环

题意: 给一个边权均为1的无向图,求图中的最大环. 分析: tarjan算法一般用来强连通分量,它依次访问图中的各个强连通分量,这题要求最大环,而环也是强连通分量的一部分,所以可以在每个点访问其他点时修改时间戳,达到每个环上时间戳连续的目的,这样当访问到一个栈中节点时就能直接更新最大环了.根据同样的思路,即使边权任意,也可求最大环或最小环. 代码: //poj 3895 //sep9 #include <iostream> #include <vector> #include &l

求水洼的问题(或者是说求图中连通子图的个数)----深度优先算法

遇到这个题的时候,不太容易快速的想到思路:可能会比较容易想到使用递归的思想:但是具体怎么写呢?其实这个题就相当于是图论中的求连通图,很容易应该想到的是深度优先搜索或者是广度优先搜索:我们就用深度优先算法来求这个题目:直接求有几个区域不好求,那么我们换个思路来求,这种题就是这样,直接求不好求,但是当我们转换一下思路之后就豁然开朗: 我们遍历所有的点,当遇到有水的点时,就将它周围的(八个方向)所有的水点都消除:所以在主遍历for循环中遇到几个水点就是有几个水洼: /*****************

求图中欧拉回路数量

问题描述:输入点数n.边数m.每条边连接的两个点a,b,求此无向图中不包括一个点本身的欧拉回路数量,重复不计: 解决此问题,则需要在深搜的基础上判断新搜出的欧拉回路是否已经被走过,可以利用搜索时所打的标记来判断: 使用邻接表,需要注意在无向图中连接两点有两条边,要同时考虑: 以下为代码: #include<iostream>#include<cstdio>#include<cstring>using namespace std;int n,m,cnt[105],ct,q

poj The Settlers of Catan( 求图中的最长路 小数据量 暴力dfs搜索(递归回溯))

The Settlers of Catan Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1123   Accepted: 732 Description Within Settlers of Catan, the 1995 German game of the year, players attempt to dominate an island by building roads, settlements and c

在图中寻找最短路径-----深度优先算法C++实现

求从图中的任意一点(起点)到另一点(终点)的最短路径,最短距离: 图中有数字的点表示为图中的不同海拔的高地,不能通过:没有数字的点表示海拔为0,为平地可以通过: 这个是典型的求图中两点的最短路径:本例,用深度优先算法来实现: 在每一个点都有四个方向(有的点的有些方向不能通过),所以在每一个点处要处理四种方向的情况: 深度优先算法函数怎么写? 也就是写递归函数...但是递归函数肿么写??? 第一:判断初始态,从起点出发,刚开始步数为0:dfs(start_x, start_y, 0); 第二:从起

[Python] 弗洛伊德(Floyd)算法求图的直径并记录路径

相关概念 对于一个图G=(V, E),求图中两点u, v间最短路径长度,称为图的最短路径问题.最短路径中最长的称为图的直径. 其中,求图中确定的某两点的最短路径算法,称为单源最短路径算法.求图中任意两点间的最短路径算法,称为多源最短路径算法. 常用的路径算法有: Dijkstra算法 SPFA算法\Bellman-Ford算法 Floyd算法\Floyd-Warshall算法 Johnson算法 其中最经典的是Dijkstra算法和Floyd算法.Floyd算法是多源最短路径算法,可以直接求出图

Spark Graphx图计算案例实战之aggregateMessages求社交网络中的最大年纪追求者和平均年纪!

Spark Graphx提供了mapReduceTriplets来对图进行聚合计算,但是1.2以后不再推荐使用,源代码如下: @deprecated("use aggregateMessages", "1.2.0") def mapReduceTriplets[A: ClassTag](     mapFunc: EdgeTriplet[VD, ED] => Iterator[(VertexId, A)],     reduceFunc: (A, A) =&g

poj 2117 Electricity 【无向图求割点】【求去掉一个点后 图中最多的BCC数目】

Electricity Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4597   Accepted: 1515 Description Blackouts and Dark Nights (also known as ACM++) is a company that provides electricity. The company owns several power plants, each of them sup