一、实验目的
学习掌握图的存储结构
利用最短路径算法,通过java编程实现最短路径输出。
二、实验环境
Eclip平台
三、实验过程
最短路径算法问题是计算机科学、运筹学、地理信息系统和交通诱导、导航系统等领域研究的一个热点。传统的最短路径算法主要有Floyd算法和Dijkstra算法。Floyd
算法用于计算所有结点之间的最短路径。Dijkstra算法则用于计算一个结点到其他所有结点的最短路径。本程序利用Dijkstra算法用java语言实现最短路径的可视化。
流程: 画无向邻接矩阵 邻接矩阵初始化 求取最短路径
Java文件如下
Main.java 文件:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
喝纯奶的好处
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.StringTokenizer;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.TitledBorder;
public class Main {
public static void main(String args[]) {
new UI("最短路径");
}
}
第二次世界大战的时间@SuppressWarnings("rial")
化学类
class UI extends JFrame implements ActionListener, ItemListener {戴尔卡内基
JFrame frame;
JButton button;
JLabel label1, label2, label3;
JComboBox list1, list2;
JPanel panel1, panel2;
ShortCanvas canvas;
ShortInit inits;
SetFont f;
String circlename[];
String circle1, circle2;
String path[];
int circlenum;
int list2_index;
int D[];
int renum[];
int num = 0;
UI(String s) {
super(s);
canvas = new ShortCanvas();
add(canvas,BorderLayout.CENTER);
f=new SetFont();
inits = new ShortInit();
circlename = inits.getcirclename();
circlenum =inits.getcirclenum();
肖肖乐乐 circle1 = circlename[0];
circle2 = circlename[0];
panel2 = new JPanel();
panel2.tBorder(new TitledBorder("最短路径"));
panel2.tBackground(Color.white);
panel2.tLayout(new FlowLayout(FlowLayout.LEADING, 5, 5));
label1 = new JLabel("起点", JLabel.LEFT);
label1.tFont(f.tSysFontAndFace());
panel2.add(label1);
list1 = new JComboBox();
list1.addItemListener(this);
list1.tMaximumRowCount(5);// 设置 JComboBox 显示的最大行数
panel2.add(list1);
label2 = new JLabel("终点");
label2.tFont(f.tSysFontAndFace());
panel2.add(label2);
list2 = new JComboBox();
list2.addItemListener(this);
panel2.add(list2);
list2手机进水能修好吗.tMaximumRowCount(5);// 设置 JComboBox 显示的最大行数
for (int i = 0; i < circlenum; i++) {
list1.addItem(circlename[i]);
list2.addItem(circlename[i]);
}
button = new JButton("确定");
button.addActionListener(this);
button.tFont(f.tSysFontAndFace());
panel2.add(button);
label3 = new JLabel("");
label3.tFont(f.tSysFontAndFace());
panel2.add(label3);
add(panel2,BorderLayout.SOUTH);
tDefaultCloOperation(JFrame.EXIT_ON_CLOSE);
tBounds(100, 100, 530, 547);
tVisible(true);
validate();
}
public void itemStateChanged(ItemEvent e) {
if (e.getSource() == list1)
circle1 = (String) list1.getSelectedItem();
if (e.getSource() == list2) {
circle2 = (String) list2.getSelectedItem();
list2_index = list2.getSelectedIndex();
}
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == button) {
ShortPath sp = new ShortPath(circle1, circle2);
path = sp.getpath();
D = sp.getD();
label3.tText("最短路径为:" + D[list2_index]);
renum = new int[circlenum];
财务管培生 StringTokenizer fenxi = new StringTokenizer(path[list2_index], "->");
num = 0;
while (fenxi.hasMoreTokens()) {
String str = Token();
for (int i = 0; i < circlenum; i++) {
if (str.equals(circlename[i])) {
renum[num] = i;
num++;
}
}
}
canvas.flag = 1;
canvas.resultroad = renum;
canvas.num = num;
canvas.repaint();
}
}
}
SetFont.java文件
import java.awt.Font;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
//系统外观处理
@SuppressWarnings("rial")
public class SetFont extends JFrame {
public Font tSysFontAndFace() {
try {// 根据类名称设置外观
UIManager
.tLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch (UnsupportedLookAndFeelException ex) {
} catch (IllegalAccessException ex) {
} catch (InstantiationException ex) {
} catch (ClassNotFoundException ex) {
}
Font font = new Font("新宋体", Font.ITALIC + Font.BOLD, 17);
return font;
}
}
ShortCanvas.java文件:
//画无向邻接矩阵
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
@SuppressWarnings("rial")
运动跑步public class ShortCanvas extends Canvas {
SetFont f;
ShortInit init;
String circlename[];
int roadlength[];
int arcs[][]; // 带权邻接矩阵
int circlenum;
int roadnum;
int location[][]; // 各点坐标