1030 Travel Plan (30分)(Java)

題目描述

在這裏插入圖片描述在這裏插入圖片描述

AC代碼

import java.util.*;
public class Main{
	static Scanner scan=new Scanner(System.in);
	static class Graph{		//聲明爲靜態類
		final int inf=0x3fffffff,maxn=500;
		private final int vertex,edges,start,des;	//頂點數,邊數,起始點,終點
		
		/*感覺java定義個數組好麻煩=.=*/
		private Integer[][] G=new Integer[maxn][maxn];
		private Integer[] d=new Integer[maxn];
		private Integer[] c=new Integer[maxn];
		private Integer[][] cost=new Integer[maxn][maxn];
		private Integer[] pre=new Integer[maxn];
		private Boolean[] vis=new Boolean[maxn];
		Graph() {		//構造函數
			vertex=scan.nextInt();
			edges=scan.nextInt();
			start=scan.nextInt();
			des=scan.nextInt();
			for(int i=0;i<maxn;i++) {
				for(int j=0;j<maxn;j++) G[i][j]=inf;
			}
			Arrays.fill(vis,false);		//Arrays.fill提供fill方法
			for(int i=0;i<edges;i++) {
				int c1=scan.nextInt(),c2=scan.nextInt();
				int td=scan.nextInt(),tc=scan.nextInt();
				G[c1][c2]=G[c2][c1]=td;
				cost[c1][c2]=cost[c2][c1]=tc;				
			}
		}
		void Dijkstra() {		//依舊是經典的Dijkstra函數
			Arrays.fill(d,inf);
			for(int i=0;i<vertex;i++) pre[i]=i;
			c[start]=d[start]=0;
			for(int i=0;i<vertex;i++) {
				int u=-1,min=inf;
				for(int j=0;j<vertex;j++) {
					if(vis[j]==false&&d[j]<min) {
						u=j;min=d[j];
					}
				}
				if(u==-1) return;
				vis[u]=true;
				for(int v=0;v<vertex;v++) {
					if(vis[v]==false&&G[u][v]!=inf) {
						if(d[u]+G[u][v]<d[v]) {
							d[v]=d[u]+G[u][v];
							c[v]=c[u]+cost[u][v];
							pre[v]=u;
						}
						else if(d[u]+G[u][v]==d[v]&&c[u]+cost[u][v]<c[v]) {
							c[v]=c[u]+cost[u][v];
							pre[v]=u;
						}
					}
				}
			}
		}
		void dfs(int v) {
			if(v==start) {
				System.out.print(v+" ");
				return;
			}
			dfs(pre[v]);
			System.out.print(v+" ");
		}
	}
	public static void main(String[] args) {
		Graph graph=new Graph();
		graph.Dijkstra();
		graph.dfs(graph.des);
		System.out.print(graph.d[graph.des]+" "+graph.c[graph.des]);
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章