中兴代码

这段代码实现了从文件中读取数据,构建图数据结构,然后找到满足特定条件(节点数量和必经节点)的最短路径。路径选择考虑了节点个数限制、必经节点和不可通过的边。最终将结果输出到文件中,以适应Pajek软件的数据输入格式。
摘要由CSDN通过智能技术生成
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值