はい、これは時間で実行できると思います。以下にその方法を概説します。おそらくもっと簡単な方法がありますが、次の方法で十分です。O(1)
前処理。私たちはあなたのツリーをいくつかのルートを持つルート化されたツリーとして見ることができると仮定します。前処理では、各内部ノード、子孫であるリーフの一例を注釈として付けます。これは、非常に単純なトップダウントラバーサル(DFS)を使用して、前処理時間で実行できます。wwO(n+m)
また、を次のように再帰的に定義しますに兄弟がある場合、 ; それ以外の場合、ここで、はの親です。そして、ここではの根です。英語では、は、から始まり、2つ以上の子(またはルート)を持つノードに到達するまで上向きに続くノードとして定義されます。前処理では、各ノードのの値を計算し、それをに関連付けて保存します。これもで計算することができますp∗(⋅)wp∗(w)=wp∗(w)=p∗(v)vwp∗(r)=rrTp∗(w)wp∗(w)wwO(n+m)時間。
クエリに答える。さて、ここでクエリに答えるためにどのようにだから到達可能な任意の葉を返すを含むパスを持つに、無他のエッジの事件をv(u,v)v:
ケース1:が子であるます。次に、クエリに応答すると、子孫である葉が返されます。これは、の注釈を使用して時間で実行できます。uvuO(1)u
ケース2:がの親であり、に少なくとも1つの他の子があるとします。次に、他の子を見て、それをと呼びます。次に、クエリに応答すると、子孫である葉が返されます。これは、の注釈を使用して時間で実行できます。uvuuwwO(1)w
ケース3:がの親であり、には他の子がないとします。次に、とし、(祖先ではなく)他の子にします。次に、クエリに応答すると、子孫である葉が返されます。これは、の注釈を使用して時間で実行できます。uvuu′=p∗(u)wu′vwO(1)w
3つのケースすべてで、クエリへの回答は時間で計算できます。O(1)