日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 大臣的旅费_PREV-9-蓝桥杯-历届试题-大臣的旅费-java

發布時間:2025/7/14 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 大臣的旅费_PREV-9-蓝桥杯-历届试题-大臣的旅费-java 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這道題我也不會寫,然后參考了這篇---->

https://blog.csdn.net/Look_star/article/details/88032821

只是我覺得他的描述還不夠清晰,所以把自己理解的思路完善一下。

注:

不懂這個:

求一棵樹之間兩點最長的距離,即樹的直徑。

所以又搜了資料:

出自:https://www.cnblogs.com/tonghao/p/4740425.html

要用兩次DFS求最長的距離。

而最遠的點G-D,他們之間的距離即整棵樹距離最長。

這里默認他們的權值為1,只是為了說明原理,具體搜索要根據路徑的權值來定。

先給出所有的代碼,然后對代碼各部分進行詳細解釋。

1 importjava.util.ArrayList;2 importjava.util.Arrays;3 importjava.util.Scanner;4

5 //動態鏈表

6 classVertex{7 ArrayList V=newArrayList();8 }9 classEdge{10 ArrayList E=newArrayList();11 }12

13 public classMain {14 final static int INF=0X3f3f3f3f;//10^9一般數都達不到這個,所以用它作為最大值

15 final static int maxn=100000;16 static Vertex[] v=new Vertex[maxn+5];//V[i]存儲與i相鄰接的節點

17 static Edge[] e=new Edge[maxn+5];//e[i]存儲與i鄰接的邊的距離

18 static boolean vis[]=new boolean[maxn+5];//防止重復訪問

19 static int dis[]=new int[maxn+5];//存儲原始結點到各結點的dfs距離

20

21 static void init(int n){//初始化

22 for(int i=0;i

24 e[i]=newEdge();25 }26 }27

28 static void dfs(inta){29 int len=v[a].V.size();//與a相鄰接的城市有幾個

30 vis[a]=true;//a城市已經訪問

31 for(int i=0;i

32 int j=v[a].V.get(i);//依次獲取a鄰接的幾個城市

33 if(!vis[j]&&e[a].E.get(i)!=INF){34 vis[j]=true;35 dis[j]=dis[a]+e[a].E.get(i);36 dfs(j);37 vis[j]=false;//回溯

38 }39 }40 }41

42 public static voidmain(String[] args) {43 Scanner sc=newScanner(System.in);44 int n=sc.nextInt();45

46 init(n);47

48 for(int i=0;i

53 e[a].E.add(c);//用e記錄對應的a-b的距離

54 v[b].V.add(a);//反之b可以到a

55 e[b].E.add(c);//用e記錄對應的b-a的距離

56 }57

58 //此類包含用來操作數組(比如排序和搜索)的各種方法59 //將制定的false,INF分配給對應數組中的每個元素,相當于for初始操作的簡化

60 Arrays.fill(vis,false);61 Arrays.fill(dis,INF);62

63 dis[0]=0;64 dfs(0);//第一次遍歷 求得某個城市到最遠的城市的最大距離是多少,并用dis[]來記錄 比如sid[1]=67;

65 long max=-1;66 int temp=-1;67 for(int i=0;imax){69 max=dis[i];70 temp=i;71 }72 }73

74 Arrays.fill(vis, false);75 Arrays.fill(dis, INF);76

77 dis[temp]=0;78 dfs(temp);//第二次遍歷 求b與?距離最遠

79 long ans=-1;//防止越界

80 for(int i=0;ians){82 ans=dis[i];83 temp=i;84 }85 }86 ans=ans*(ans+21)/2;87 System.out.println(ans);88 sc.close();89

90 }91

92 }

自定義兩個類,分別構造了動態鏈表。

INF=0X3f3f3f3f可自行百度,簡潔意思就是0X3f3f3f3f即十進制的 10的9次方,表示一個超大的數,一般情況都達不到。此處用作后面作為一個標志。

maxn作用可能是因為在藍橋杯提交檢測時最后輸入的n是10000;所以在初始定義的時候就先創建一個比10000大的范圍,所以 后面用了 maxn+5

init(n)就是確定具體的動態鏈表多長

看main方法中:

DFS深度優先搜索:

在之前,先把數據準備好,

執行過程——> 可能有些亂。。但花了很久時間。

第一次dfs結束后,dis[ ]存儲了0到各城市的距離,在之后的操作中就是得到最遠距離max,且用temp記錄下與0最遠的城市,也就是城市4,下標為3

第二次遍歷就是從3開始了。這次要找到距離3最遠的城市。步驟原理同上,

這是第二次DFS結束,可以看出最遠的應該是dis[4] 距離為9

然后進行最后的計算就可以得出所花費的錢了。

好像代碼里的注解會有些錯誤,因為代碼里的注釋不是最后的理解,有錯好像沒更改過來?

有點奇怪的是兩次提交一個正確一個錯誤,中間好像沒怎么修改啊,出現兩個結果我還是有些一頭霧水。

這個代碼是之前的,如果運行錯誤,可找原文的代碼,配上我寫的注釋一起看。

總結

以上是生活随笔為你收集整理的java 大臣的旅费_PREV-9-蓝桥杯-历届试题-大臣的旅费-java的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。