題目分析:本題開始一直在考慮如何將每乙個節點通過一種合適的資料結構儲存起來(一對多的關係),最後發現借助並查集的思想可以用乙個陣列p,p[i]存放i節點的父節點,每次查詢編號為i的節點屬於第幾層且判斷是否有以該點位父元素的節點(判斷該點是否為葉子節點,是則floor[對應層數]++)由於本題的圖不存在環路,則借助這個p陣列則能十分巧妙將整棵樹儲存下來,本題還借助了vis陣列存放某個節點是否出現過(因為n個節點並不一定是有序出現的),mat陣列存放下標為i時是否是葉子節點,floor陣列i層的葉子節點的總數,本題需要額外注意的細節是:輸入的n和m,m有可能是0,則由於根節點一定是1,所以第0層一定有乙個葉子節點(1號節點本身),此外對於輸入的每一行資料,每個節點的孩子節點數也有可能是0(0則代表是葉子節點,沒有孩子節點)
1 #include2 #include3using
namespace
std;45
int vis[105]; //
記錄i點是否是樹上的節點
6int floor[105]; //
記錄每一層的葉子節點的數量 1為0層
7int p[105]; //
記錄i的父節點
8int mat[105]; //
儲存是否有以i為父節點的節點 i
9int
max_flo;
1011
void serach(int
x)18
if(flo > max_flo) max_flo =flo;
19if(mat[t] == 0) 22}
2324
intmain()46}
47for(int i = 1; i <= 100; i++)51}
52for(int i = 0; i <= max_flo; i++)
56 printf("\n"
);57}58
return0;
59 }
PAT甲級題解1004
注意的是m代表的是the number of non leaf nodes 要看清楚題意,一開始把n m認為是輸入的行數了 利用vector特性 題意大致是尋找每層葉結點的個數,dfs遍歷這棵樹,遍歷時統計即可。include using namespace std const int maxn 1...
pat甲級1107 並查集
並查集在findfather 函式中進行壓縮路徑,陷阱是這裡只壓縮該結點以上到根的路徑,其以下的路徑不壓縮,這裡不搞清楚會有三個測試點過不去 include include include using namespace std int n vector int hobby 1001 int fat...
PAT 甲級並查集總結
並查集 disjoint set 是一種可以動態維護若干個不重疊的集合,並支援合併與查詢兩種操作的一種資料結構。init 初始化 union int x,int y 合併兩個元素 findfather int x v找元素的所屬集合 我們建立乙個陣列father表示乙個並查集,father i 表示...