//本人第一次发博客,有什么不对的地方,还请谅解
主要功能设计
1.图的初始化 | 由函数init()实现 |
2.学校景点介绍- | 简单循环输出 |
3.查看浏览路线 | 迪杰斯特拉算法实现 |
4.查看两景点之间的最短路径 | 弗洛伊德算法实现 |
5.景点信息查询 | 对应输出 |
6.更改图信息 | 图的基本操作 |
7.打印邻接矩阵 | 输出邻接矩阵的值 |
8.退出 | 退出系统 |
存储结构设计
class Vexsinfo {
public int ID;
public String name;
public String introduction;
public boolean isVisited;
public Vexsinfo(int id,String name, String a)
{
this.ID=id;
this.name=name;
this.introduction=a;
this.isVisited=false;
}
}
class MGraph/*图结构信息,邻接矩阵表示*/ {
public Vexsinfo[]vexs;/*顶点信息*/
public int [][]arcs;/*邻接矩阵,用整型值表示权值*/
public int arcNum;/*边数*/
public int vexNum;/*顶点数*/
public MGraph(int maxVexsNum,int maxsize) {
this.vexs=new Vexsinfo[maxVexsNum];
this.arcs=new int[maxsize][maxsize];
this.arcNum=maxVexsNum;
this.vexNum=maxsize;
init();
}
}
详细设计
/*显示景点所有信息景点*/
public void introduceCompus()/*1.校园简介,显示各地点的编号`名称和简介*/
{
System.out.format("\n\n%-6s%-30s%s\n","编号","景点名称","简介");
System.out.print(" \n");
for(int i=0;i<this.vexNum;i++)
System.out.format("%-6d%-30s%s\n",this.vexs[i].ID,this.vexs[i].name,this.vexs[i].introduction);
System.out.print(" \n");
}
/*查看浏览线路 */
public void browsePath()/*显示从给定景点出发,到其他景点的最短路径 */
{
/*迪杰斯特拉算法,求从顶点v0到其余顶点的最短路径p[][]及其带权长度d[v](最短路径的距离)
* P[][]数组用于存放两顶点间是否有通路标志。若p[v][w]==1,则w是从v0到v的最短路径上的顶点*/
int min,t=0,v0; //v0为起始景点编号
int []d=new int[35];
int [][]p=new int[35][35];
System.out.print("\n请输入一个起始景点编号");
Scanner sc=new Scanner(System.in);
v0=sc.nextInt();
System.out.print("\n\n");
while(v0<0||v0>this.vexNum)
{
System.out.print("\n你所输入的景点编号不存在");
System.out.print("\n请重新输入");
v0=sc.nextInt();
}
for(int v=0;v<this.vexNum;v++)
{
this.vexs[v].isVisited=false; //初始化各顶点访问标志
d[v]=this.arcs[v0][v]; //v0到各顶点v的权值赋值给d[v]
/*初始化p[][]数组,各顶点间的路径全部设置为空路径0*/
for(int w=0;w<this.vexNum;w++)
p[v][w]=0;
if(d[v]<1000) //v0到v有边相连,修改p[v][v0]的值为1
{
p[v][v0]=1;
p[v][v]=1; //各顶点自己到自己要连通
}
}
d[v0]=0; //自己到自己的权值为0
this.vexs[v0].isVisited=true; //v0的访问标志设为true,v属于s集
/*对其余vexNum-1个顶点w,依次求v到w的最短路径*/
for(int i=1;i<this.vexNum;i++)
{
min=1000;
/*在未被访问的顶点中,查找与v0最近的顶点v*/
for(int w=0;w<this.vexNum;w++)
if(!this.vexs[w].isVisited&&d[w]<min)
{
t=w;
min=d[w];
}
this.vexs[t].isVisited=true;//v的访问标志设置为1,v属于s集
/*修改v0到其余各顶点w的最短路径权值d[w]*/
for(int w=0;w<this.vexNum;w++)
/*若w不属于s,且v到w有边相连*/
if(!this.vexs[w].isVisited&&(min+this.arcs[t][w]<d[w]))
{
d[w]=min+this.arcs[t][w];//修改v0到w的权值d[w]
/*所有v0到vde最短路径上的顶点x,都是v0到w的*/
for(int x=0;x<this.vexNum;x++)
p[w][x]=p[t][x];/*最短路径上的顶点*/
p[w][w]=1;
}
}
for(int v=0;v<this.vexNum;v++)/*输出v0到其他顶点v的最短路径*/
{
if(v!=v0)
System.out.print(this.vexs[v0].name);//输出景点v0的景点名
/*对图中每个顶点w,试探w是否是v0到v的最短路径上的顶点*/
for(int w=0;w<this.vexNum;w++)
{
/*若w是,且w不等于v0,则输出该景点*/
if(p[v][w]==1&&w!=v0&&w!=v)
System.out.print("--->"+this.vexs[w].name);
}
System.out.print("--->"+this.vexs[v].name);
System.out.print("\t总路线长为"+d[v]+"米\n\n");
}
}
public void showShortestPath()
{
/*用floyd算法,求各对顶点v和w间的最短路径p[][][]及其带权长度d[v][w]
* 若p[v][w][u]==1,则u是v到w的当前求得的最短路径上的顶点*/
int j,k;
int [][]d=new int [23][23];
int [][][]p1=new int [23][23][23];
/*初始化各对顶点v,w之间的起始距离d[v][w]及p[v][w][]数组*/
for(int v=0;v<this.vexNum;v++)
for(int w=0;w<this.vexNum;w++)
{