Java编写一个路由算法,并txt输入输出

路由算法:1-9均代表主机名称

1. 输入:

图3拓扑的输入文件为input.txt,本算法为双向线,来回只需输入一个即可

Input.txt:

leftnodeID,rightnodeID,bandwidth

1,3,100

1,4,100

2,3,100

2,4,100

3,4,100

3,5,100

3,6,100

4,5,100

4,6,100

5,6,100

5,7,100

5,8,100

6,7,100

6,8,100

;

srcNodeID,dstNodeID,bandwidth

1,7,90

1,8,90

其中leftnodeID为左节点(字段名固定),rightnodeID右节点(字段名固定),bandwidth带宽,srcNodeID源节点(字段名固定),dstNodeID目的节点(字段名固定),根据算法不同,字段名可以按需增加。

2. 运算:

C:\Users\xwx202247>算法.exe input.txt output.txt

3. 输出:

经算法计算后的计算结果输出文件output.txt

Output.txt:

1,3,6,7

2,4,5,8

代码如下:

import java.io.*;

import java.util.*;

public class RouteDesign {

final static int maxnum = 100;

final static int minint = 0;

final static int maxint = 999999;

static int dist [] = new int [maxnum];   //当前路径中的最小带宽

static int mprev[] = new int [maxnum];   //当前节点的前一跳节点

static int c[][] = new int [maxnum][maxnum]; // 两个节点之间的带宽

static int hop[] = new int [maxnum]; //当前节点到源节点的跳数

public static void Dijkstra(int n,int v,int b,int dist[],int mprev[],int c[][]){

boolean s[] = new boolean[maxnum];

for(int i=1;i<=n;i++){

dist[i] = c[v][i];              //当前最小带宽等于v,i之间带宽

s[i]=false;

if(dist[i]==minint)

mprev[i] = 0;            //带宽等于0,则没有下一跳

else{

mprev[i] = v;            //否则下一跳是v,跳数为1

hop[i]=1;

}

}

dist[v] = maxint;

s[v] = true;

for(int i=2;i<=n;i++){

int tmp = b;

int u = v;

for(int j=1;j<=n;j++){

if(!s[j]&&dist[j]>=tmp){      //如果该点不是源点并且源点到j点路径是最短

u=j;

tmp=dist[j];

}

}

s[u]=true;

for(int j=1;j<=n;j++){

int least = dist[u];

if(c[u][j]<dist[u])

least=c[u][j]; //最得最小带宽值

if((!s[j])&&(least>dist[j])){ //如果当前节点到源点的路径中的带宽过小,更新当前节点最小带宽及路径

hop[j]=hop[u]+1;

mprev[j]=u;

dist[j]=least;

}

else if(!s[j]&&(least == dist[j])){ //如果相等则比较跳数,跳数小者成为当前节点的路径

if(hop[j]>hop[u]+1){

hop[j]=hop[u]+1;

mprev[j]= u;

dist[j]=least;

}

}

}

}

}

public static void searchPath(int mprev[],int v,int u,String output) throws FileNotFoundException{

OutputStream out = new FileOutputStream(output,true);

int que[] = new int[maxnum];

int tot=1;

que[tot]=u;

tot++;

int tmp = mprev[u];  //设置tmp当前节点的u节点的前一跳

while(tmp!=v){

que[tot] =tmp;

tot++;

tmp=mprev[tmp];

}

que[tot]=v;

for(int i = tot;i>=i;i--){

if(i!=1){

int num=que[i];

try{

out.write(String.valueOf(num).getBytes());

out.write(",".getBytes());

}catch (IOException e){

e.printStackTrace();

}

}

else{

try{

out.write(String.valueOf(que[i]).getBytes());

out.write("\r\n".getBytes());

}catch(IOException e){

e.printStackTrace();

}

}

}

try{

out.close();

}catch(IOException e){

e.printStackTrace();        //打印堆栈中数据

}

}

public static void main(String[] args) throws IOException {

// TODO Auto-generated method stub

String input = args[0];

String output = args[1];

BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(new File(input))) );

String str = new String ();

int NodeNum=0;

int LineNum=0;

Vector<String>vstr = new Vector<String>();

Vector<String>dstr = new Vector<String>();

str = in.readLine();

while(true){

str=in.readLine();

if(str.isEmpty()){

break;

}

vstr.add(str);

LineNum++;

}

in.readLine();

in.readLine();

while(true){

str=in.readLine();

if(str==null)

break;

else if(str.isEmpty())

break;

dstr.add(str);                          //将str插入到vector中

}

String LastLine = (String)vstr.lastElement();

String[] strdata = LastLine.split("\\,");

int firststr = Integer.parseInt(strdata[0]);     //String字符类型数据转换为Integer整型数据,strdata[0]就是输入参数中的第一个参数字符串。

int secondstr = Integer.parseInt(strdata[1]);

if(firststr<secondstr)

NodeNum = secondstr;

else

NodeNum = firststr;

for(int i=1;i<NodeNum;i++){

for(int j=1;j<NodeNum;j++){

c[i][j]=minint;

}

}

for(int i=1;i<=LineNum;i++){

String Readvstr = (String)vstr.get(i-1);

String [] vstrdata = Readvstr.split("\\,");

int firstvstr = Integer.parseInt(vstrdata[0]);

int secondvstr = Integer.parseInt(vstrdata[1]);

int thirdvstr = Integer.parseInt(vstrdata[2]);

if(thirdvstr>c[firstvstr][secondvstr]){

c[firstvstr][secondvstr]=thirdvstr;

c[secondvstr][firstvstr]=thirdvstr;

}

}

for(int i=1;i<NodeNum;i++){

dist[i]=minint;

hop[i]=minint;

}

int src,dst,bdw;

OutputStream out = new FileOutputStream(output,false);

out.write("".getBytes());

out.close();

for(int i=1;i<=dstr.size();i++){

String Readvstr = (String)dstr.get(i-1);

String sdstr[] =Readvstr.split(",");

src = Integer.parseInt(sdstr[0]);

dst = Integer.parseInt(sdstr[1]);

bdw = Integer.parseInt(sdstr[2]);                    //排序

Dijkstra(NodeNum,src,bdw,dist,mprev,c);

searchPath(mprev,src,dst,output);

}

}

}

时间: 2024-12-24 17:50:30

Java编写一个路由算法,并txt输入输出的相关文章

Java编写一个四位数的随机验证码

import java.util.Random; /* 随机数类 Random 需求: 编写一个函数随机产生四位的验证码.  */ public class Demo5 { public static void main(String[] args) { /* Random random = new Random(); int randomNum = random.nextInt(10)+1; //产生 的 随机数就是0-10之间 System.out.println("随机数:"+ 

面试题之java 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 要求不能出现截半的情况

题目:10. 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串. 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”. 一.需要分析 1.输入为一个字符串和字节数,输出为按字节截取的字符串-------------->按照字节[byte]截取操作字符串,先将String转换成byte类型 .2.汉字不可以截半----------------------------------

java,编写一个从1循环到150并在每行打印一个值,另外在每个3的倍数行上打印出foo,在每个5的倍数行上打印biz,在每个7的倍数上打印baz.

需求:编写一个从1循环到150并在每行打印一个值,另外在每个3的倍数行上打印出foo,在每个5的倍数行上打印biz,在每个7的倍数上打印baz. package study01; public class For { public static void main(String[] args) { for(int i = 1;i<=150;i++){ System.out.print(i); if(i%3==0){ System.out.print(" foo"); } if(i

如何用Java编写一个简单的服务器和客户机

今天我要向大家介绍的是自己编写的一个比较简单的服务器和客户机程序,注意一下哦,比较简单.好了,闲话休提,砸门直入主题. 小编先从客户机和服务器的模型开始讲解.简单来说,我们实现的这种模型呢,我们每一个用户称为一个客户机,用户之间的通信之间需要一个中转,所有客户机的通信都依托于这个中转,很明显,这个中转,就是砸门的服务器了.整个模型比较简单明了,那么,接下来我们就直接进入实现阶段. 我们从实现服务器开始.Java提供了这样的一个类,ServerSocket.我们通过实例化它的方式来创建一个服务器.

Java编写一个随机产生小学生四则运算题30道

//注:这个程序还没有实现的地方为分数的计算方法未能实现,只是简单的两个数运算,没有实现多个数,四则运算中的数没有涉及0. package 课堂测试1;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.PrintWriter;import java.util.Random;public class Arithmetic { String f() { int i=(int)

用 Java 实现一个插入排序算法

有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法:插入排序法.插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据搜索,算法适用于少量数据的排序. 插入排序算法把要排序的数组分成两部分:第一部分包含了这个数组除了最后一位的所有元素,而第二部分就只包含这一个元素(即待插入元素).在第一部分排序后,再将最后这个元素插入到第一部分中的正确位置. 说明:这里的最后一位,也可以

用 Java 实现一个快速排序算法

       快速排序是排序算法中效率最高的一种,它是利用递归的原理,把数组无限制的分成两个部分,直到所有数据都排好序为止. 快速排序是对冒泡排序的一种改进.它的基本思想是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 如果要排序的数组是 A[1]--A[N-1],首先任意选取一个数据(通常选用第一个数据)作为中间数据,然后将所有比它小的数都放

编写一个程序,将 a.txt 文件中的单词与 b.txt 文件中的单词交替合并到 c.txt 文件中,a.txt 文件中的单词用回车符分隔,b.txt 文件中用回车或空格进行分隔。

import java.io.BufferedReader; import java.io.FileInputStream; import java.io.InputStreamReader; import java.io.PrintWriter; public class A { public static void main(String[] args) throws Exception { FileManage a = new FileManage("src/main/resources/

java编写一个可以进行多个选择题测验评分的程序(从高分到低分依次输出学生和成绩)

public class GradeExam { public static void main(String[] args) { char[][] answers = { {'A','B','A','C','C','D','E','E','A','D'}, {'D','B','A','B','C','A','E','E','A','D'}, {'E','D','D','A','C','B','E','E','A','D'}, {'C','B','A','E','D','C','E','E','