Jelajahi Sumber

最近公共祖先

爱玲姐姐 5 tahun lalu
induk
melakukan
c00949097a
1 mengubah file dengan 61 tambahan dan 0 penghapusan
  1. 61 0
      D.cpp

+ 61 - 0
D.cpp

@@ -0,0 +1,61 @@
+#include <iostream>
+#include <vector>
+#include <cstring>
+using namespace std;
+const int maxn = 100010, maxh=40;
+struct node{
+    int deep, home, father;
+};
+int home[maxh];
+node tree[maxn];
+int buildTree(int s){
+    if(s==1||tree[s].deep!=0){
+        return tree[s].deep;
+    }
+    return tree[s].deep = buildTree(tree[s].father)+1;
+} 
+void find(int u, int v){
+    home[tree[u].home]=1, home[tree[v].home]=1;
+    if(tree[u].deep<tree[v].deep)
+        swap(u, v);
+    int differ = tree[u].deep-tree[v].deep;
+    for(int i=1; i<=differ; i++){
+        u = tree[u].father;
+        home[tree[u].home]=1;
+    }
+    if(u==v)
+        return;
+    while(u!=v){
+        u = tree[u].father;
+        home[tree[u].home]=1;
+        v = tree[v].father;
+        home[tree[v].home]=1;
+    }
+}
+int main(){
+    int T, kase=1, n, m, q, u, v;
+    cin>>T;
+    while(kase<=T){
+        memset(tree, 0, sizeof(tree));
+        cout<<"Case "<<kase++<<":"<<endl; 
+        cin>>n>>m>>q;
+        for(int i=1; i<=n; i++)
+            cin>>tree[i].home;
+        for(int i=1; i<n; i++){
+            cin>>u>>v;
+            tree[v].father=u;
+        }
+        for(int i=1; i<=n; i++)
+            if(i!=1&&tree[i].deep==0) 
+                tree[i].deep=buildTree(tree[i].father)+1;
+        for(int i=1; i<=q; i++){
+            cin>>u>>v;
+            find(u, v);
+            for(int i=1; i<=m; i++)
+                if(home[i])
+                    cout<<i<<" ";
+            cout<<endl;
+            memset(home, 0, sizeof(home));
+        }
+    }
+}