返回列表 發帖

深度優先搜尋演算法 (一) - 無分岔點最深距離

本帖最後由 許婷芳 於 2020-8-15 17:50 編輯

利用深度優先搜尋演算法 (Depth-First-Search, DFS),找出樹狀結構中,自根部開始最深的距離。

輸入分為兩部分,第一部分為共有幾個成員,第二部分為所有關係。
以下圖為例,共有6個成員,它們的關係是 2-1-0-3-5-4。

輸出顯示最深距離。

  1. import java.util.Scanner;

  2. public class P4 {

  3.         Scanner s;
  4.         int n;              //成員數
  5.         int rlts[][];       //所有關係
  6.         int hasParent[];    //每個成員各有幾個父母
  7.         int hasChild[];     //每個成員各有幾個孩子
  8.         int theHead=0;      //最老的祖先
  9.         int dfsResult;

  10.         P4()
  11.         {
  12.                 s=new Scanner(System.in);
  13.                 n=s.nextInt();
  14.                 rlts=new int[n-1][2];
  15.                 for(int i=0; i<n-1; i++)
  16.                         for(int j=0; j<2; j++)
  17.                                 rlts[i][j]=s.nextInt();
  18.                 hasParent=new int[n];
  19.                 hasChild=new int[n];

  20.                 for(int i=0; i<n; i++)
  21.                         hasParent[i]=0;
  22.                 for(int i=0; i<n; i++)
  23.                         hasChild[i]=0;
  24.                 for(int i=0; i<n-1; i++)   //計算每個成員,父母及孩子的數量
  25.                 {
  26.                         hasChild[rlts[i][0]]++;
  27.                         hasParent[rlts[i][1]]++;
  28.                 }
  29.                 /*
  30.                   2 1
  31.                   1 0
  32.                   0 3
  33.                   3 5
  34.                   5 4         
  35.                  hasChild 1,1,1,1,0,1              
  36.                  hasParent 1,1,0,1,1,1     
  37.                  */
  38.                 for(int i=0; i<n; i++)
  39.                         if(hasParent[i]==0)   //誰沒父母,就是最老的祖先
  40.                                 theHead=i;

  41.                 dfsResult=dfs(theHead);

  42.                 System.out.println("最深距離: "+dfsResult);
  43.         }

  44.         int dfs(int h)     //深度優先搜尋,回傳最遠距離
  45.         {

  46.                 if(hasChild[h]==0)     //無孩子,表示已到尾端
  47.                         return 0;
  48.                 else
  49.                 {
  50.                         for(int i=0; i<n-1; i++)    //找他的小孩是誰
  51.                                 if(rlts[i][0]==h)
  52.                                         return dfs(rlts[i][1])+1;   //將孩子變成父母丟回去遞迴,距離值加1
  53.                 }
  54.                 return 0;   //回傳0避免編譯錯誤
  55.         }

  56.         /*
  57.              dfs(2)
  58.              =dfs(1)+1
  59.              =dfs(0)+1+1
  60.              =dfs(3)+1+1+1
  61.              =dfs(5)+1+1+1+1
  62.              =dfs(4)+1+1+1+1+1
  63.              =0+1+1+1+1+1
  64.              =5
  65.          */

  66.         public static void main(String[] args) {
  67.                 new P4();
  68.         }   
  69. }
複製代碼

此帖僅作者可見

TOP

此帖僅作者可見

TOP

此帖僅作者可見

TOP

此帖僅作者可見

TOP

此帖僅作者可見

TOP

此帖僅作者可見

TOP

此帖僅作者可見

TOP

返回列表