java实现寻找有向图的的闭环_Mary
java实现寻找有向图的的闭环
(1) 需要从txt文件中获取源数据;
(2) java实现寻找有向图的的闭环源代码
package p17;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class DsfCycle {
/**
* 限制node最大数
*/
private static int MAX_NODE_COUNT = 100;
/**
* node集合
*/
private static List<String> nodes = new ArrayList<String>();
/**
* 有向图的邻接矩阵
*/
private static int[][] adjacencyMatrix = new int[MAX_NODE_COUNT][MAX_NODE_COUNT];
/**
* @param nodeName
* @return
* @Title addNode
* @Description 添加节点
* @date 2018年5月17日
*/
private static int addNode(String nodeName) {
if (!nodes.contains(nodeName)) {
if (nodes.size() >= MAX_NODE_COUNT) {
System.out.println("nodes超长:" + nodeName);
return -1;
}
nodes.add(nodeName);
return nodes.size() - 1;
}
return nodes.indexOf(nodeName);
}
/**
* @param startNode
* @param endNode
* @Title addLine
* @Description 添加线,初始化邻接矩阵
* @date 2018年5月17日
*/
public static void addLine(String startNode, String endNode) {
int startIndex = addNode(startNode);
int endIndex = addNode(endNode);
if (startIndex >= 0 && endIndex >= 0) {
adjacencyMatrix[startIndex][endIndex] = 1;
}
}
/**
* @return
* @Title find
* @Description 寻找闭环
* @date 2018年5月17日
*/
public static List<String> find() {
// 从出发节点到当前节点的轨迹
List<Integer> trace = new ArrayList<Integer>();
//返回值
List<String> reslut = new ArrayList<>();
if (adjacencyMatrix.length > 0) {
findCycle(0, trace, reslut);
}
if (reslut.size() == 0) {
reslut.add("no cycle!");
}
return reslut;
}
/**
* @param v
* @param trace
* @param reslut
* @Title findCycle
* @Description dfs
* @date 2018年5月17日
*/
private static void findCycle(int v, List<Integer> trace, List<String> reslut) {
int j;
//添加闭环信息
if ((j = trace.indexOf(v)) != -1) {
StringBuffer sb = new StringBuffer();
String startNode = nodes.get(trace.get(j));
while (j < trace.size()) {
sb.append(nodes.get(trace.get(j)) + "-");
j++;
}
reslut.add("cycle:" + sb.toString() + startNode);
return;
}
trace.add(v);
for (int i = 0; i < nodes.size(); i++) {
if (adjacencyMatrix[v][i] == 1) {
findCycle(i, trace, reslut);
}
}
trace.remove(trace.size() - 1);
}
public static void main(String arg[]) throws Exception {
// 读文件
String path = DsfCycle.class.getClassLoader().getResource("PCProperties.txt").getPath();
FileReader fr = new FileReader(path);
BufferedReader br = new BufferedReader(fr);
String str = null;
String str1=null;
while((str = br.readLine()) != null) {
str1=br.readLine();
DsfCycle.addLine(str,str1);
}
// 关闭流
br.close();
fr.close();
List<String> reslut = DsfCycle.find();
for (String string : reslut) {
System.out.println(string);
}
}
}
相关链接
下一篇:
crdownload格式的打开方法。
