有向图中,打印出所有的回路(Java)
具体思路:利用DFS算法深度遍历图中的每一个节点。在遍历的同时设置一个list,用来存放已经遍历过的点;如果再遍历到这个点(说明形成了回路)的时候就打印出来。
注意点:
- 需要记录每一个点“是否被访问过”的状态。
- 由于是有向图,所以实际上并不能保证从一个特定的点出发能够遍历到图中所有的点,因此需要从图中每一个点出发将图遍历一遍。
- 在遍历不同的节点的时候需要注意将图中点的状态全部恢复
下面是具体代码
最后两个函数sortString
和bubbleArray
两个函数是没有必要的,是为了让输出更加的美观添加的函数。
import java.io.*;
import java.util.*;
public class Main {
/*要求:判断一个有向图中是否有回路,并且打印出所有的回路。
思路:通过修改的DFS算法遍历有向图。
在遍历的过程中,把遍历到的所有的元素都存储到一个队列里面,然后每次遍历到一个节点的时候就检查一下这个队列;要是队列里面已经有重复的元素
那就表明已经形成了回路,然后打印出来这个回路;然后中断遍历,回去遍历别的节点。
*/
private String filename = "";
//用邻接表来初始化要检查的有向图
private Map<String,ArrayList<String>> Graph = new HashMap<String, ArrayList<String>>();
ArrayList POINTS = new ArrayList();
public void initGraph() throws IOException {
File file = new File(filename);
FileInputStream fileInputStream = new FileInputStream(file);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
String line = null;
while ((line = bufferedReader.readLine()) != null){
String[] temp = line.split(",");
if (!POINTS.contains(temp[0])){
POINTS.add(temp[0]);
}
if (!POINTS