package zhongXing;
import java.util.*;
import java.util.Map.Entry;
import java.io.*;
public class choosePath {
/*
* @splitString 二维的String类型的数组,用于存储split(" ")切割后,返回的Sting类型的数组
* @colOfDatas 用于记录数据的行数
* @setOfVetixInGraph 用于存储图中的节点
* @mapOfVetixToNum 用于把节点和节点编号一一对应,节点编号从0开始
* @valueOfEdge 权值矩阵, 用于快速获取边的权值
*
*
*
* */
private static String startNode;
private static String endNode;
private static ArrayList arrayListOfChoosedPath=new ArrayList();
private static ArrayList arrayListOfMustThoughNode=new ArrayList();
private static ArrayList arrayListOfMustThoughEdge=new ArrayList();
private static ArrayList arrayListOfCanNotThoughEdge=new ArrayList();
private static int needOfNode;
public static void main(String[] args) throws IOException {
//sumCol变量用于记录数据集中边的数量
int sumCol=0;
BufferedReader bfr2 = new BufferedReader(new FileReader(
"C://Users//Administrator//Desktop//text//case.txt"));
bfr2.readLine();
bfr2.readLine();
while(!bfr2.readLine().equals("")){
sumCol++;
}
System.out.println("tempcol="+sumCol);
String tempMustThoughNode=null;
while(!(tempMustThoughNode=bfr2.readLine()).equals("")){
System.out.println(tempMustThoughNode);
arrayListOfMustThoughNode.add(tempMustThoughNode);
}
while(!(tempMustThoughNode=bfr2.readLine()).equals("")){
System.out.println(tempMustThoughNode);
arrayListOfMustThoughEdge.add(tempMustThoughNode.split(" ")[0]);
arrayListOfMustThoughEdge.add(tempMustThoughNode.split(" ")[1]);
}
while((tempMustThoughNode=bfr2.readLine())!=null){
System.out.println(tempMustThoughNode);
arrayListOfCanNotThoughEdge.add(tempMustThoughNode.split(" ")[0]);
arrayListOfCanNotThoughEdge.add(tempMustThoughNode.split(" ")[1]);
}
bfr2.close();
BufferedReader bfr = new BufferedReader(new FileReader(
"C://Users//Administrator//Desktop//text//case.txt"));
String [] info=bfr.readLine().split(" ");
startNode=info[1];
endNode=info[2];
needOfNode=Integer.parseInt(info[3]);
//定义一个二维的String类型的数组,用于存储split(" ")切割后,返回的Sting类型的数组
String[][] splitString = new String[sumCol][2];
//colOfDatas变量用于记录数据的行数
int colOfDatas = 0;
//临时变量,记录每次读取到的一行String
String flagOfReadLineString = null;
bfr.readLine();
//while循环用于把读取到的一行String用split(" ")切割后的一维String数组的地址给二维数组splitString的第一维
while (!(flagOfReadLineString = bfr.readLine()).equals("")) {
splitString[colOfDatas++] = flagOfReadLineString.split(" ");
}
//打印输出数据集的行数
System.out.println("colOfDatas=" + sumCol);
System.out.println("splitString.length="+splitString.length);
// setOfVetixInGraph用于存储图中的节点(利用Set中元素不重复的特点,依次把边的两端的节点往Set集合中添加,实现数据集中节点的获取及存储)
Set<String> setOfVetixInGraph = new TreeSet<String>();
for (int i = 0; i < splitString.length; i++) {
setOfVetixInGraph.add(splitString[i][0]);
setOfVetixInGraph.add(splitString[i][1]);
}
System.out.println("这个数据集中一个有" + setOfVetixInGraph.size() + "个节点");
// 定义Map集合mapOfVetixToNum,用于把节点和节点编号一一对应,节点编号从0开始
//原理是:利用依次遍历上面的setOfVetixInGraph中的元素,同时用节点编号来对应标识
Map<String, Integer> mapOfVetixToNum = new TreeMap<String, Integer>();
Iterator<String> it = setOfVetixInGraph.iterator();
String flagOfVetixToNum = null;
//labelOfVetix,用于标注节点的编号
int labelOfVetix = 0;
while (it.hasNext()) {
flagOfVetixToNum = it.next();
mapOfVetixToNum.put(flagOfVetixToNum, labelOfVetix++);
}
//把节点和节点标号对应起来的集合打印出来
Syst
中兴代码
最新推荐文章于 2021-03-29 20:15:08 发布
这段代码实现了从文件中读取数据,构建图数据结构,然后找到满足特定条件(节点数量和必经节点)的最短路径。路径选择考虑了节点个数限制、必经节点和不可通过的边。最终将结果输出到文件中,以适应Pajek软件的数据输入格式。
摘要由CSDN通过智能技术生成