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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

杭电1325java实现

發(fā)布時間:2025/3/20 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 杭电1325java实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目鏈接
問題描述
樹是一個眾所周知的數(shù)據(jù)結(jié)構(gòu),它可以是空的(null,void,nothing),也可以是一組由節(jié)點之間的有向邊連接起來的一個或多個節(jié)點,滿足以下屬性。
只有一個節(jié)點稱為根,沒有有向邊指向它。

除根之外的每個節(jié)點都只有一條邊指向它。

從根到每個節(jié)點有一個唯一的有向邊序列。

例如,請考慮下面的插圖,其中節(jié)點用圓圈表示,邊用箭頭表示。前兩個是樹,但最后一個不是。

在這個問題中,將給出幾個由有向邊連接的節(jié)點集合的描述。對于其中的每一個,您將確定集合是否滿足樹的定義。

輸入
輸入將由一系列描述(測試用例)組成,后跟一對負(fù)整數(shù)。每個測試用例將包含一系列邊緣描述,后跟一對零。每個邊緣描述將由一對整數(shù)組成;第一個整數(shù)標(biāo)識邊緣從其開始的節(jié)點,第二個整數(shù)標(biāo)識邊緣指向的節(jié)點。節(jié)點號總是大于零。

輸出
對于每個測試用例,顯示行“Case k是一棵樹”或行“Case k不是樹”,其中k對應(yīng)于測試用例編號(它們從1開始按順序編號)。
Sample Input
6 8 5 3 5 2 6 4
5 6 0 0
8 1 7 3 6 2 8 9 7 5
7 4 7 8 7 6 0 0
3 8 6 8 6 4
5 3 5 6 5 2 0 0
-1 -1

Sample Output
Case 1 is a tree.
Case 2 is a tree.
Case 3 is not a tree.
雖然是并查集的運用,但是還是有一點不一樣的,這個樹的合并不僅僅是兩棵樹的合并,他是有順序的,輸入a,b,樹就是a為根,b為子,不僅僅如此,還有一點很重要的就是一個節(jié)點可以指向很多節(jié)點,然而只能有一個節(jié)點指向它,也就是說插入(a,b)中b的根節(jié)點必須是b,如果不滿足那么就不是該條件的tree,同時,還要滿足普通樹的無聯(lián)通,不分離(一棵樹)。成不成樹我是用boolean值判斷,最后只需判斷隨便一個節(jié)點的樹的路徑數(shù)是否等于該有的路徑樹。
下面附上代碼(注意(0,0)要單獨處理)

import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class 杭電oj1325 { static int tree[]=new int[10005]; static int end=0;//標(biāo)記最后的結(jié)果public static void main(String[] args) {Scanner sc=new Scanner(System.in); int exa=0;boolean bool=true;int t=1;for(int q=0;q<10005;q ) {tree[q]=-1;}while(sc.hasNext()){ int a=sc.nextInt();int b=sc.nextInt();if(a<0&&b<0)break;if(b!=0) {exa=b;}if(a==0&&b==0) {//(0,0)要特殊考慮if(bool&&(end==value(exa)-1)||exa==0) System.out.println("Case " t " is a tree.");else System.out.println("Case " t " is not a tree.""");exa=0;end=0;bool=true;tree=new int[10005];for(int i=0;i<10005;i ){tree[i]=-1;}}else if(bool){bool=union(a,b);}}}public static boolean union(int a,int b)//表示 a,b所在的樹合并{int a1=search(a);//a根int b1=search(b);//b根int a2=value(a);int b2=value(b);if(a1==b1||b!=b1) {return false;}else {end ;tree[a1] =tree[b1];//個數(shù)相加 注意是負(fù)數(shù)相加tree[b1]=a1; //b樹成為a的子樹,直接指向a; }return true;} public static int search(int a)//返回頭節(jié)點的數(shù)值{if(tree[a]>0)//說明是子節(jié)點{return search(tree[a]);}elsereturn a;}public static int value(int a)//返回a所在樹的大小(個數(shù)){if(tree[a]>0){return value(tree[a]);}elsereturn -tree[a];} }

本人小白,優(yōu)化和復(fù)雜優(yōu)化的不夠好,請大佬指出。

《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的杭电1325java实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。