⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zdlj.java

📁 这实一个求最短路径的实验
💻 JAVA
字号:
import java.awt.*;
import java.awt.event.*;
class xy{
	int  x;
	int y;
	
	public xy(int X, int Y){
		x=X;
		y=Y;
		
	} 
	

}
interface List{
   public void insert(int i,Object obj) throws Exception;
   public Object delete(int i) throws Exception;
   public Object getData(int i) throws Exception;
   public int size();
   public boolean isEmpty();
}
class SeqList implements List{
	final int defaultSize = 10;
	
	int maxSize;
	int size;
	Object[] listArray;
	
	SeqList(){
		initiate(defaultSize);
	}
	
    SeqList(int size){
		initiate(size);
	}
	
	public void initiate(int sz){
		maxSize = sz;
		size = 0;
		listArray = new Object[sz];
	}
	
	public void insert(int i,Object obj) throws Exception{		
		if (size == maxSize){
		 	throw new Exception("顺序表已满无法插入!");
		}
		if (i > size){
			throw new Exception("参数错误!");
		}
				
		for(int j = size; j > i; j--){
			listArray[j] = listArray[j-1];
		}
		
		listArray[i] = obj;
		size++; 
	}
	
	public Object delete(int i) throws Exception{		
		if(size == 0){
			throw new Exception("顺序表已空无法删除!");
		}
		if (i > size-1){
			throw new Exception("参数错误!");
		}
		Object it = listArray[i];
		for(int j = i; j < size-1; j++){
			listArray[j] = listArray[j+1]; 
		}
			
		size--;
		return it;	
	}
	
	public Object getData(int i) throws Exception{		
		if(i < 0 || i >= size){
			throw new Exception("参数错误!");
		}
		return listArray[i];
	}
	
	public int size(){
		return size;
	}
	
	public boolean isEmpty(){
		return size == 0;
	}
	
	public int MoreDataDelete(SeqList L, Object x) throws Exception{
		
		int i, j;
		int tag = 0;
		
		for(i = 0; i < L.size; i++){
			if(x.equals(L.getData(i))){
				L.delete(i);
				i --;
				tag = 1;
			}
		}
		
		return tag;
	}	
}
//---------------------------------------图
class AdjMWGraph{
	static final int maxWeight = 10000;
	
	private SeqList vertices; 					//存储结点的顺序表
	private int[][] edge;						//存储边的二维数组
	private int numOfEdges;						//边的个数
	
	public AdjMWGraph(int maxV){			//构造函数,maxV为结点个数
		vertices = new SeqList(maxV);
		edge = new int[maxV][maxV];
		for(int i = 0; i < maxV; i ++){
			for(int j = 0; j < maxV; j ++){
				if(i == j)
					edge[i][j] = 0;
				else
					edge[i][j] = maxWeight;	
			}
		}
		numOfEdges = 0;
	}
	
	public int getNumOfVertices(){						//返回结点个数
		return vertices.size;
	}
	
	public int getNumOfEdges(){							//返回边的个数
		return numOfEdges;
	} 
	
	public Object getValue(int v) throws Exception{	
//返回结点v的数据元素
		return vertices.getData(v);
	}
	
	public int getWeight(int v1, int v2) throws Exception{
//返回边<v1,v2>的权值
		if(v1 < 0 || v1 >= vertices.size || v2 < 0 || v2 >= vertices.size)
			throw new Exception("参数v1或v2越界出错!");
		return edge[v1][v2];
	}
	
	public void insertVertex(Object vertex) throws Exception{
//插入结点
		vertices.insert(vertices.size, vertex);
	}
	
	public void insertEdge(int v1, int v2, int weight) throws Exception{
	//插入边<v1,v2>,权值为weight
		if(v1 < 0 || v1 >= vertices.size || v2 < 0 || v2 >= vertices.size)
			throw new Exception("参数v1或v2越界出错!");
		edge[v1][v2] = weight; 							//置边的权值
		numOfEdges ++;									//边的个数加1
	}

	public void deleteEdge(int v1, int v2) throws Exception{
	//删除边<v1,v2>
		if(v1 < 0 || v1 > vertices.size || v2 < 0 || v2 > vertices.size)
			throw new Exception("参数v1或v2越界出错!");
		if(edge[v1][v2] == maxWeight || v1 == v2)
			throw new Exception("该边不存在!");
		
		edge[v1][v2] = maxWeight;				//置边的权值为无穷大
		numOfEdges --;									//边的个数减1
	}
	
	public int getFirstNeighbor(int v) throws Exception{			
//取结点v的第一个邻接结点。若存在返回该结点的下标序号,否则返回-1
		if(v < 0 || v >= vertices.size)
			throw new Exception("参数v越界出错!");
		for(int col = 0; col < vertices.size; col ++)
			if(edge[v][col] > 0 && edge[v][col] < maxWeight)
				return col;
		return - 1;			
	}
	
	public int getNextNeighbor(int v1, int v2) throws Exception{
//取结点v1的邻接结点v2后的邻接结点
//若存在返回该结点的下标序号,否则返回-1
		if(v1 < 0 || v1 >= vertices.size || v2 < 0 || v2 >= vertices.size)
			throw new Exception("参数v1或v2越界出错!");
		for(int col = v2 + 1; col < vertices.size; col ++)
			if(edge[v1][col] > 0 && edge[v1][col] < maxWeight)
				return col;
		return - 1;			
	}
		

	

}
	
//----------------------------------
 class RowColWeight{
	int row;
	int col;
	int weight;
	
	public RowColWeight(int r, int c, int w){
		row = r;
		col = c;
		weight = w;
	}
	
	public static void createGraph(AdjMWGraph g, Object[] v, int n, RowColWeight[] rc, int e) throws Exception{
		for(int i = 0; i < n; i ++)
			g.insertVertex(v[i]);
		for(int k = 0; k < e; k ++)
			g.insertEdge(rc[k].row, rc[k].col, rc[k].weight);	
	}
}
class Dijkstra{

	static final int maxWeight = 9999;

	public static void dijkstra(AdjMWGraph g, int v0, int[] distance, int path[]) throws Exception{
		int n = g.getNumOfVertices();
		int[] s = new int[n];
		int minDis, u = 0;
		
		for(int i = 0; i < n; i ++){
			distance[i] = g.getWeight(v0, i);
			s[i] = 0;
			if(i != v0 && distance[i] < maxWeight)
				path[i] = v0;
			else
				path[i] = -1;	
		}
		s[v0] = 1;
		
		for(int i = 1; i < n; i ++){
			minDis = maxWeight;
			for(int j = 0; j < n; j ++)
				if(s[j] == 0 && distance[j] < minDis){
					u = j;
					minDis = distance[j];
				}
			if(minDis == maxWeight) return;
			
			s[u] = 1;
			
			for(int j = 0; j < n; j ++)
				if(s[j] == 0 && g.getWeight(u, j) < maxWeight && distance[u] + g.getWeight(u, j) < distance[j]){
					distance[j] = distance[u] + g.getWeight(u, j);
					path[j] = u;
				}	
		}
	}
}

class MyCanvas extends Canvas {
	int b1lag=0;
	int clear=-1;
	xy []zuobiao={new xy(10,250),new xy(100,100),new xy(100,185),new xy(100,340),new xy(100,425),
		new xy(200,150),new xy(200,250),new xy(200,350),new xy(300,150),new xy(300,250),new xy(300,350),
		new xy(400,255)
		};
	MyCanvas() {
		setSize(500,500);
		setBackground(Color.cyan);
	}			
	public void setClear(int clear){
		this.clear=clear;
	}	
	public void paint(Graphics g2){
			g2.drawString("1",10,240);
			g2.drawLine(zuobiao[0].x,zuobiao[0].y,zuobiao[1].x,zuobiao[1].y);g2.drawString("9",50,174);
			g2.drawLine(zuobiao[0].x,zuobiao[0].y,zuobiao[2].x,zuobiao[2].y);g2.drawString("7",50,220);
			g2.drawLine(zuobiao[0].x,zuobiao[0].y,zuobiao[3].x,zuobiao[3].y);g2.drawString("3",50,300);
			g2.drawLine(zuobiao[0].x,zuobiao[0].y,zuobiao[4].x,zuobiao[4].y);g2.drawString("2",50,350);
			g2.drawString("2",100,90);
			g2.drawLine(zuobiao[1].x,zuobiao[1].y,zuobiao[5].x,zuobiao[5].y);g2.drawString("4",150,135);
			g2.drawLine(zuobiao[1].x,zuobiao[1].y,zuobiao[6].x,zuobiao[6].y);g2.drawString("2",130,145);
			g2.drawLine(zuobiao[1].x,zuobiao[1].y,zuobiao[7].x,zuobiao[7].y);g2.drawString("1",110,142);
			g2.drawString("3",90,185);
			g2.drawLine(zuobiao[2].x,zuobiao[2].y,zuobiao[5].x,zuobiao[5].y);g2.drawString("2",113,180);
			g2.drawLine(zuobiao[2].x,zuobiao[2].y,zuobiao[6].x,zuobiao[6].y);g2.drawString("7",114,200);
			g2.drawString("4",100,330);
			g2.drawLine(zuobiao[3].x,zuobiao[3].y,zuobiao[7].x,zuobiao[7].y);g2.drawString("11",118,350);
			g2.drawString("5",100,415);
			g2.drawLine(zuobiao[4].x,zuobiao[4].y,zuobiao[6].x,zuobiao[6].y);g2.drawString("11",118,390);
			g2.drawLine(zuobiao[4].x,zuobiao[4].y,zuobiao[7].x,zuobiao[7].y);g2.drawString("8",124,410);
			g2.drawString("6",200,140);
			g2.drawLine(zuobiao[5].x,zuobiao[5].y,zuobiao[8].x,zuobiao[8].y);g2.drawString("6",230,153);
			g2.drawLine(zuobiao[5].x,zuobiao[5].y,zuobiao[9].x,zuobiao[9].y);g2.drawString("5",230,193);
			g2.drawString("7",200,240);
			g2.drawLine(zuobiao[6].x,zuobiao[6].y,zuobiao[8].x,zuobiao[8].y);g2.drawString("4",230,220);
			g2.drawLine(zuobiao[6].x,zuobiao[6].y,zuobiao[9].x,zuobiao[9].y);g2.drawString("3",230,250);
			g2.drawString("8",200,340);
			g2.drawLine(zuobiao[7].x,zuobiao[7].y,zuobiao[9].x,zuobiao[9].y);g2.drawString("5",230,320);
			g2.drawLine(zuobiao[7].x,zuobiao[7].y,zuobiao[10].x,zuobiao[10].y);g2.drawString("6",230,350);
			g2.drawString("9",300,150);
			g2.drawLine(zuobiao[8].x,zuobiao[8].y,zuobiao[11].x,zuobiao[11].y);g2.drawString("4",340,195);
			g2.drawString("10",300,240);
			g2.drawLine(zuobiao[9].x,zuobiao[9].y,zuobiao[11].x,zuobiao[11].y);g2.drawString("2",350,260);
			g2.drawString("11",290,340);
			g2.drawLine(zuobiao[10].x,zuobiao[10].y,zuobiao[11].x,zuobiao[11].y);g2.drawString("5",339,310);
			g2.drawString("12",400,245);
			if(b1lag==1){
				g2.setColor(Color.green);
				g2.drawLine(zuobiao[0].x,zuobiao[0].y,zuobiao[2].x,zuobiao[2].y);
				g2.drawLine(zuobiao[0].x,zuobiao[0].y,zuobiao[2].x,zuobiao[2].y);
				g2.drawLine(zuobiao[2].x,zuobiao[2].y,zuobiao[5].x,zuobiao[5].y);
				g2.drawLine(zuobiao[5].x,zuobiao[5].y,zuobiao[9].x,zuobiao[9].y);
				g2.drawLine(zuobiao[9].x,zuobiao[9].y,zuobiao[11].x,zuobiao[11].y);
			}
	}	


}	
class WinCanvas extends Frame implements ActionListener{
	MyCanvas canvas;
	Button b1;
	
	WinCanvas(String t){
		super(t);
		canvas=new MyCanvas();
		 b1=new Button("最短路径");
		 b1.addActionListener(this);
		setLayout(new FlowLayout());
		add(canvas,BorderLayout.CENTER);
		Panel p=new Panel();
		p.add(b1);
		add(p,BorderLayout.SOUTH);
		setVisible(true);
		setBounds(50,50,900,600);
		//setBounds(20,20,500,500);
		validate();
	}
	public void actionPerformed(ActionEvent e){
		canvas.setClear(0);
		canvas.b1lag=1;
		canvas.repaint();
	}
}
public class zdlj{
	static final int maxVertices = 100;
	public static void createGraph(AdjMWGraph g, Object[] v, int n, RowColWeight[] rc, int e) throws Exception{
		for(int i = 0; i < n; i ++)
			g.insertVertex(v[i]);
		for(int k = 0; k < e; k ++)
			g.insertEdge(rc[k].row, rc[k].col, rc[k].weight);	
	}
	public static void main(String arg[]){
		AdjMWGraph g = new AdjMWGraph(maxVertices);
		Integer[] a = {new Integer("1"),new Integer("2"),new Integer("3"),new Integer("4"),
		new Integer("5"),new Integer("6"),new Integer("7"),new Integer("8"),new Integer("9"),
		new Integer("10"),new Integer("11"),new Integer("12")};
		RowColWeight[] rcw = {new RowColWeight(0,1,9),new RowColWeight(0,2,7),new RowColWeight(0,3,3),
		new RowColWeight(0,4,2),new RowColWeight(1,5,4),new RowColWeight(1,6,2),
		new RowColWeight(1,7,1),new RowColWeight(2,5,2),new RowColWeight(2,6,7),new RowColWeight(3,7,11),
		new RowColWeight(4,6,11),new RowColWeight(4,7,8),new RowColWeight(5,8,6),new RowColWeight(5,9,5),
		new RowColWeight(6,8,4),new RowColWeight(6,9,3),new RowColWeight(7,9,5),new RowColWeight(7,10,6),
		new RowColWeight(8,11,4),new RowColWeight(9,11,2),new RowColWeight(10,11,5)};
		int n = 12, e = 21;
		try{
			createGraph(g,a,n,rcw,e);
			
			int[] distance = new int[n];
			int[] path = new int[n];
			
			Dijkstra.dijkstra(g, 0, distance, path);
			
			
			int x=n-1;
			int y[]=new int[n];
	
			int z=-1;
			int flag=0;
			
			
			
			while(x!=0){
				switch(path[x]){
					case  0 :
					y[flag]=1 ;x=0;break;
					case  1 :
					y[flag]=2 ;x=1;break;
					case  2 :
					y[flag]=3 ;x=2;break;
					case  3 :
					y[flag]=4 ;x=3;break;
					case  4 :
					y[flag]=5 ;x=4;break;
					case  5 :
					y[flag]=6 ;x=5;break;
					case  6 :
					y[flag]=7 ;x=6;break;
					case  7 :
					y[flag]=8 ;x=7;break;
					case  8 :
					y[flag]=9 ;x=8;break;
					case  9 :
					y[flag]=10 ;x=9;break;
					case  10 :
					y[flag]=11 ;x=10;break;
					case  11 :
					y[flag]=12 ;x=11;break;
					
				}			
				z++;
				flag++;
			
			}
			System.out.println(
				"1到12的最短路径:");
			while(z>=0){
			System.out.println(y[z]+" ");
			z--;
		
			}
			System.out.println(12);
		}
		catch (Exception ex){
			ex.printStackTrace();
		}
		//WinCanvas win=new WinCanvas();
		WinCanvas win=new WinCanvas("实验端四最短路径");
	}
		
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -