1. java 最短路徑演算法 如何實現有向 任意兩點的最短路徑
Dijkstra(迪傑斯特拉)演算法是典型的最短路徑路由演算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴展,直到擴展到終點為止。
Dijkstra一般的表述通常有兩種方式,一種用永久和臨時標號方式,一種是用OPEN, CLOSE表方式
用OPEN,CLOSE表的方式,其採用的是貪心法的演算法策略,大概過程如下:
1.聲明兩個集合,open和close,open用於存儲未遍歷的節點,close用來存儲已遍歷的節點
2.初始階段,將初始節點放入close,其他所有節點放入open
3.以初始節點為中心向外一層層遍歷,獲取離指定節點最近的子節點放入close並從新計算路徑,直至close包含所有子節點
代碼實例如下:
Node對象用於封裝節點信息,包括名字和子節點
[java] view plain
public class Node {
private String name;
private Map<Node,Integer> child=new HashMap<Node,Integer>();
public Node(String name){
this.name=name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Map<Node, Integer> getChild() {
return child;
}
public void setChild(Map<Node, Integer> child) {
this.child = child;
}
}
MapBuilder用於初始化數據源,返回圖的起始節點
[java] view plain
public class MapBuilder {
public Node build(Set<Node> open, Set<Node> close){
Node nodeA=new Node("A");
Node nodeB=new Node("B");
Node nodeC=new Node("C");
Node nodeD=new Node("D");
Node nodeE=new Node("E");
Node nodeF=new Node("F");
Node nodeG=new Node("G");
Node nodeH=new Node("H");
nodeA.getChild().put(nodeB, 1);
nodeA.getChild().put(nodeC, 1);
nodeA.getChild().put(nodeD, 4);
nodeA.getChild().put(nodeG, 5);
nodeA.getChild().put(nodeF, 2);
nodeB.getChild().put(nodeA, 1);
nodeB.getChild().put(nodeF, 2);
nodeB.getChild().put(nodeH, 4);
nodeC.getChild().put(nodeA, 1);
nodeC.getChild().put(nodeG, 3);
nodeD.getChild().put(nodeA, 4);
nodeD.getChild().put(nodeE, 1);
nodeE.getChild().put(nodeD, 1);
nodeE.getChild().put(nodeF, 1);
nodeF.getChild().put(nodeE, 1);
nodeF.getChild().put(nodeB, 2);
nodeF.getChild().put(nodeA, 2);
nodeG.getChild().put(nodeC, 3);
nodeG.getChild().put(nodeA, 5);
nodeG.getChild().put(nodeH, 1);
nodeH.getChild().put(nodeB, 4);
nodeH.getChild().put(nodeG, 1);
open.add(nodeB);
open.add(nodeC);
open.add(nodeD);
open.add(nodeE);
open.add(nodeF);
open.add(nodeG);
open.add(nodeH);
close.add(nodeA);
return nodeA;
}
}
圖的結構如下圖所示:
Dijkstra對象用於計算起始節點到所有其他節點的最短路徑
[java] view plain
public class Dijkstra {
Set<Node> open=new HashSet<Node>();
Set<Node> close=new HashSet<Node>();
Map<String,Integer> path=new HashMap<String,Integer>();//封裝路徑距離
Map<String,String> pathInfo=new HashMap<String,String>();//封裝路徑信息
public Node init(){
//初始路徑,因沒有A->E這條路徑,所以path(E)設置為Integer.MAX_VALUE
path.put("B", 1);
pathInfo.put("B", "A->B");
path.put("C", 1);
pathInfo.put("C", "A->C");
path.put("D", 4);
pathInfo.put("D", "A->D");
path.put("E", Integer.MAX_VALUE);
pathInfo.put("E", "A");
path.put("F", 2);
pathInfo.put("F", "A->F");
path.put("G", 5);
pathInfo.put("G", "A->G");
path.put("H", Integer.MAX_VALUE);
pathInfo.put("H", "A");
//將初始節點放入close,其他節點放入open
Node start=new MapBuilder().build(open,close);
return start;
}
public void computePath(Node start){
Node nearest=getShortestPath(start);//取距離start節點最近的子節點,放入close
if(nearest==null){
return;
}
close.add(nearest);
open.remove(nearest);
Map<Node,Integer> childs=nearest.getChild();
for(Node child:childs.keySet()){
if(open.contains(child)){//如果子節點在open中
Integer newCompute=path.get(nearest.getName())+childs.get(child);
if(path.get(child.getName())>newCompute){//之前設置的距離大於新計算出來的距離
path.put(child.getName(), newCompute);
pathInfo.put(child.getName(), pathInfo.get(nearest.getName())+"->"+child.getName());
}
}
}
computePath(start);//重復執行自己,確保所有子節點被遍歷
computePath(nearest);//向外一層層遞歸,直至所有頂點被遍歷
}
public void printPathInfo(){
Set<Map.Entry<String, String>> pathInfos=pathInfo.entrySet();
for(Map.Entry<String, String> pathInfo:pathInfos){
System.out.println(pathInfo.getKey()+":"+pathInfo.getValue());
}
}
/**
* 獲取與node最近的子節點
*/
private Node getShortestPath(Node node){
Node res=null;
int minDis=Integer.MAX_VALUE;
Map<Node,Integer> childs=node.getChild();
for(Node child:childs.keySet()){
if(open.contains(child)){
int distance=childs.get(child);
if(distance<minDis){
minDis=distance;
res=child;
}
}
}
return res;
}
}
Main用於測試Dijkstra對象
[java] view plain
public class Main {
public static void main(String[] args) {
Dijkstra test=new Dijkstra();
Node start=test.init();
test.computePath(start);
test.printPathInfo();
}
}
2. 用Java實現一個地鐵票價計算程序,希望給出主要演算法與數據結構
根據某市地鐵線路圖寫一個地鐵票價計算程序
需求描述:
1.計費規則:最低2元,版超過5站以上每權站加收0.5元,換乘重新起算,例如L1先坐4站,換乘L2再坐6站,結果就是2+2.5=5.5元
2.程序啟動以後讀取輸入文件(in.txt),內容格式如:
L2-8,L2-2
X3,L3-8
....
每行表示一次行程,起點站和終點站之間用逗號分隔,行數不限
4.系統按最短路徑方案(盡量少換乘且站數少,假設乘 客換乘一次用的時間相當於坐4個站)規劃路線,計算票價,並把路線和票價輸出到文件(out.txt),內容格式如:
L2-8,L2-2=2.5:L2-8,L2-7,L2-6,L2-5,L2-4,L2-3,L2-2
X3,L3-8=4:X3,X4,L3-8
....
等號後面的表示票價和路徑
地鐵線路圖如下:共有5條線路,X開頭的站點表示 換乘車站
3. 求幫助一個java地鐵換乘問題
CCircle 類定義了2個變數 pi 和 radius, 並提供獲得radius 的get方法,設置 pi和radius 的方法setCircle,獲得面積的方法 getCircleArea(), 第二個類用來測試。
類CCircle都封裝了什麼?封裝了上面說的2個變數和2個方法
求園面積的初始數據是通過那個方法實現的? void setCircle(double r, double p)
請修改程序採用構造函數的方法初始化數據。
public CCircle (double r, double p ){ this.pi=p; this.radius=r; }
4. java將時間段轉成分鍾數
publicclassDateDemo{
publicstaticvoidmain(String[]args)throwsParseException{
java.text.SimpleDateFormatsim=newjava.text.SimpleDateFormat("yyyy-MM-ddHH:mm:ss");
java.util.Dated1=sim.parse("2013-10-2205:12:10");
java.util.Dated2=sim.parse("2013-10-2308:10:10");
longxiaoshi=(((d2.getTime()-d1.getTime())/1000)/60)/60;
System.out.println("已累計在線:"+xiaoshi+"小時");
}
}
5. 用Java編寫一個程序,以小時,分,秒讀取時間長度,然後全部換算成秒並輸出結果.
classYugi{
privatestaticvoidprint(inth,intm,ints){
intss=h*60*60+m*60+s;
System.out.format("%d小時%d分%d秒等於%d秒%n",h,m,s,ss);
}
privatestaticvoidprint(ints){
inth=s/60/60;
intm=s/60%60;
intss=s%60;
System.out.format("%d秒等於%d小時%d分%d秒%n",s,h,m,ss);
}
publicstaticvoidmain(String[]args){
print(1,28,42);
print(9999);
}
}
6. 跪求java課設!急需設計北京上海地鐵路線換乘圖。願意購買!
基於你的題抄目跪求java課設!急需設計北京上海地鐵路線換乘圖。願意購...,
需要為你提供一份適用於初學者的代碼么,
請與我們聯系進一步需求,
帶著你的問題和Email來找我,
有機會可以幫你,絕對救急,
請用BaiHi為我留言,
此回復對於所有需求和和來訪者有效,
ES:\\
7. C語言 2個地鐵站之間的最短時間和轉車站名稱(急,解決的了再加100)
跟我數據結構做的廣州地鐵查詢 系統有些像。不過我 的題目是要求輸出最短路徑和轉乘站點的。我是用廣度優先做的。也可以用diksjra。
8. 百度地圖坐公交推薦路線(最佳)不是時間最短的。推薦路線是以什麼為標准時間短,不坐地鐵,少換乘。圖
是不是出錯了,我這邊推薦最佳一般是時間較少的那一條
9. 求高手用JAVA編寫一個通用程序,計算交通工具運行1000KM所需要時間.
package test;
public interface Common {
public double computeSpeed(double a, double b, double c);
}
public class Car007 implements Common{
@Override
public double computeSpeed(double a, double b, double c) {
// TODO Auto-generated method stub
if(c == 0.0) {
throw new ArithmeticException("除數為0");
}
if( a * b < 0.0) {
try {
throw new Exception("速度不能為負數");
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("a = " + a + "; b = " + b);
}
}
return a * b / c;
}
}
public class Plane implements Common{
@Override
public double computeSpeed(double a, double b, double c) {
// TODO Auto-generated method stub
if( a + b + c < 0.0) {
try {
throw new Exception("速度不能為負數");
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("a = " + a + "; b = " + b + ";c = " + c);
}
}
return a + b + c;
}
}
public class ComputeTime {
/*
*調用時, s = 1000
*/
public double getTime(double s, double a, double b, double c) {
double time = Integer.MAX_VALUE;//表示車速為0,不可能到達
double speed = new Car007().computeSpeed(a, b, c);
if(!(speed == 0.0)) {
time = s / speed;
}
return time;
}
}
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(new ComputeTime().getTime(1000, 10, 20, 30));
}
}
//計算結果:150.0
10. 求幫助一個java地鐵換乘問題
感覺這個沒有什麼價值啊,現在google,網路地圖等已經相當的成熟了,再說開發一個這樣的版網站實際作用並不明顯權。大家關心的是"能不能順利到達目的地"而不是看似能省幾分鍾的"地鐵換乘路線",再說,沒幾個人出門前會去專門上網看下換乘路線這個,就目前國內的地鐵系統來說還不是太復雜吧.主要就是給每條路線都建立一張表,相關聯的路線間用交匯點作為外鍵.每張表中站點編號即是資料庫表的編號,另外表中再存儲各點間距和每站的價格,然後程序的設計應該圍繞編號,間距,外鍵了.比方說出發點為A,終點為B.那麼演算法先查表得出距A最近的地鐵是哪張表對應的路線,記為A';再查找終點B對應的地鐵B';然後雙向查找A->B和B->A的交匯點,最終得出最短路徑.