{"id":321,"date":"2010-07-25T21:07:00","date_gmt":"2010-07-25T13:07:00","guid":{"rendered":"http:\/\/localhost\/?p=321"},"modified":"2010-07-25T21:07:00","modified_gmt":"2010-07-25T13:07:00","slug":"boring_lca_get_out_of_the_algorithm_","status":"publish","type":"post","link":"https:\/\/www.shuizilong.com\/wjmzbmr\/?p=321","title":{"rendered":"\u65e0\u804a\u5f04\u51fa\u6765\u7684Lca\u7b97\u6cd5\u3002\u3002\u3002"},"content":{"rendered":"<p> &#160;&#160; \u5929\u5929\u5728\u5f2f\u9500\u6cb9\u897f\u3002\u3002\u3002\u9893\u5e9f\u4e07\u5206\u3002\u3002\u665a\u4e0a\u603b\u7b97\u53bb\u6c34\u4e86\u9053\u9898\u3002\u3002\u6211\u65e0\u804a\u4e2d\u60f3\u51fa\u4e00\u4e2a\u5f88SB\u7684Lca\u3002\u3002\u3002<br \/>\u5c31\u662f\u628a\u8fd9\u9897\u6811\u6811\u94fe\u5256\u5206\uff08\u4e0d\u7528\u7ebf\u6bb5\u6811\u7684\uff0c\u53ea\u9700\u8981\u8bb0\u5f55\u6bcf\u4e2a\u70b9\u5bf9\u5e94\u5f53\u8def\u5f84\u7684\u6700\u9ad8\u70b9\uff09\u3002\u3002\u3002<br \/>\u7136\u540e\u8003\u8651u\u548cv\u7684Lca\uff08\u5047\u8bbeu\u7684\u6df1\u5ea6\u5927\u4e8ev\uff09\u3002\u3002\u5982\u679c\u5728\u540c\u4e00\u6761\u94fe\u4e2d\u5c31\u662fv\u3002\u3002<br \/>\u5426\u5219\u7684\u8bdd\u8bbeu\u7684\u8def\u5f84\u6700\u9ad8\u70b9\u8981\u6df1\u4e8ev\u7684\u8def\u5f84\u6700\u9ad8\u70b9\uff0c\u90a3\u4e48\u663e\u7136Lca\u4e0d\u53ef\u80fd\u5728u\u7684\u8def\u5f84\u4e2d\uff0c\u5c06u\u6362\u6210u\u7684\u8def\u5f84\u6700\u9ad8\u70b9\u7684\u7236\u8282\u70b9\u3002\u3002\u3002\u7136\u540e\u5c31\u8fd9\u9012\u5f52\u4e0b\u53bb\u3002\u3002\u3002<br \/>\u989d\u3002\u3002\u65f6\u95f4\u590d\u6742\u5ea6LogN\u3002\u3002\u9884\u5904\u7406\u590d\u6742\u5ea6\u662fO(N)\u7684\u3002\u3002\u5e38\u6570\u53c8\u6bd4\u7ebf\u6bb5\u6811\u90a3\u4e2a\u8981\u5c0f\u3002\u3002\u901f\u5ea6\u6bd4\u8bb0\u5f552^k\u7956\u5148\u90a3\u4e2a\u548c\u7ebf\u6bb5\u6811\u90fd\u8981\u5feb\u4e00\u4e9b\u3002\u3002\u6811\u94fe\u5256\u5206\u8fd8\u53ef\u4ee5\u5199Bfs..\u62d2\u7edd\u7206stack\u3002\u3002\u8fd8\u662f\u633a\u4e0d\u9519\u6ef4(*^__^*) \u563b\u563b\u3002\u3002\u3002<br \/>Code\uff1a\uff08\u9898\u76ee\u662fUral\u4e0a\u7684Tree\uff09<br \/>#include &lt;vector&gt;<br \/>#include &lt;algorithm&gt;<br \/>#include &lt;utility&gt;<br \/>#include &lt;iostream&gt;<br \/>#include &lt;cstdio&gt;<br \/>#include &lt;cmath&gt;<br \/>#include &lt;cstdlib&gt;<br \/>#include &lt;set&gt;<br \/>#include &lt;map&gt;<br \/>#include &lt;cstring&gt;<br \/>#include &lt;time.h&gt;<br \/>#define rep(i,n) for(int i=0;i&lt;n;i++)<br \/>#define pb push_back<br \/>#define Debug(x) cout&lt;&lt;#x&lt;&lt;&quot;=&quot;&lt;&lt;x&lt;&lt;endl;<br \/>#define For(i,l,r) for(int i=l;i&lt;=r;i++)<br \/>#define tr(e,x) for(eit e=x.begin();e!=x.end();e++)<br \/>#define printTime cout&lt;&lt;&quot;Time:&quot;&lt;&lt;pre-clock()&lt;&lt;endl;pre=clock();<br \/>const int inf=~0U&gt;&gt;1,maxn=50000;<br \/>using namespace std;<br \/>int n,q;<br \/>struct Edge<br \/>{<br \/>    int t,c;<br \/>    Edge(int _t,int _c):t(_t),c(_c){}<br \/>};<br \/>vector&lt;Edge&gt; E[maxn];<br \/>typedef vector&lt;Edge&gt;::iterator eit;<br \/>void AddEdge(int s,int t,int c)<br \/>{<br \/>    E[s].pb(Edge(t,c));<br \/>    E[t].pb(Edge(s,c));<br \/>}<br \/>void Init()<br \/>{<br \/>    scanf(&quot;%d&quot;,&amp;n);int s,t,c;<br \/>    rep(i,n-1)<br \/>    {<br \/>        scanf(&quot;%d%d%d&quot;,&amp;s,&amp;t,&amp;c);<br \/>        AddEdge(s,t,c);<br \/>    }<br \/>}<br \/>int D[maxn],C[maxn],F[maxn],Size[maxn];<br \/>int Q[maxn],h,t,Own[maxn];<br \/>void BFS(int vs)<br \/>{<br \/>    h=t=0;<br \/>    for(Q[t++]=vs,F[vs]=-1,D[vs]=0,C[vs]=0;h&lt;t;h++)<br \/>    {<br \/>        int x=Q[h];<br \/>        tr(e,E[x])if(e-&gt;t!=F[x])<br \/>        {<br \/>            F[e-&gt;t]=x;C[e-&gt;t]=C[x]+e-&gt;c;<br \/>            D[e-&gt;t]=D[x]+1;Q[t++]=e-&gt;t;<br \/>        }<br \/>    }<br \/>    for(int i=h-1;i&gt;=0;i&#8211;)<br \/>    {<br \/>        int x=Q[i];Size[x]=1;<br \/>        tr(e,E[x])if(e-&gt;t!=F[x])Size[x]+=Size[e-&gt;t];<br \/>    }<br \/>    memset(Own,-1,sizeof Own);<br \/>    for(int i=0;i&lt;h;i++)<br \/>    {<br \/>        int a=Q[i];<br \/>        int x=a,next;if(Own[x]&gt;=0)continue;<br \/>        for(;;x=next)<br \/>        {<br \/>            next=-1;Own[x]=a;<br \/>            tr(e,E[x])if(e-&gt;t!=F[x])<br \/>                if(next==-1||Size[e-&gt;t]&gt;Size[next])<br \/>                    next=e-&gt;t;<br \/>            if(next==-1)break;<br \/>        }<br \/>    }<br \/>}<br \/>int Lca(int u,int v)<br \/>{<br \/>    for(;;)<br \/>    {<br \/>        if(D[u]&lt;D[v])swap(u,v);<br \/>        if(Own[u]==Own[v])return v;<br \/>        if(D[Own[u]]&lt;D[Own[v]])swap(u,v);<br \/>        u=F[Own[u]];<br \/>    }<br \/>}<br \/>int Query(int u,int v)<br \/>{<br \/>    int lca=Lca(u,v);<br \/>    return C[u]+C[v]-2*C[lca];<br \/>}<br \/>void Solve()<br \/>{<br \/>    scanf(&quot;%d&quot;,&amp;q);int u,v;<br \/>    rep(i,q)<br \/>    {<br \/>        scanf(&quot;%d%d&quot;,&amp;u,&amp;v);<br \/>        printf(&quot;%dn&quot;,Query(u,v));<br \/>    }<br \/>}<br \/>int main()<br \/>{<br \/>    \/\/freopen(&quot;in&quot;,&quot;r&quot;,stdin);<br \/>    Init();<br \/>    BFS(0);<br \/>    Solve();<br \/>} <\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#160;&#160; \u5929\u5929\u5728\u5f2f\u9500\u6cb9\u897f\u3002\u3002\u3002\u9893\u5e9f\u4e07\u5206\u3002\u3002\u665a\u4e0a\u603b\u7b97\u53bb\u6c34\u4e86\u9053\u9898\u3002\u3002\u6211\u65e0\u804a\u4e2d\u60f3\u51fa\u4e00\u4e2a\u5f88SB\u7684Lca\u3002\u3002\u3002\u5c31\u662f\u628a\u8fd9\u9897\u6811\u6811\u94fe\u5256\u5206\uff08\u4e0d\u7528\u7ebf\u6bb5\u6811\u7684\uff0c\u53ea\u9700\u8981\u8bb0\u5f55\u6bcf\u4e2a\u70b9\u5bf9\u5e94\u5f53\u8def\u5f84\u7684\u6700\u9ad8\u70b9\uff09\u3002\u3002\u3002\u7136\u540e\u8003\u8651u\u548cv\u7684Lca\uff08\u5047\u8bbeu\u7684\u6df1\u5ea6\u5927\u4e8ev\uff09\u3002\u3002\u5982\u679c\u5728\u540c\u4e00\u6761\u94fe\u4e2d\u5c31\u662fv\u3002\u3002\u5426\u5219\u7684\u8bdd\u8bbeu\u7684\u8def\u5f84\u6700\u9ad8\u70b9\u8981\u6df1\u4e8ev\u7684\u8def\u5f84\u6700\u9ad8\u70b9\uff0c\u90a3\u4e48\u663e\u7136Lca\u4e0d\u53ef\u80fd\u5728u\u7684\u8def\u5f84\u4e2d\uff0c\u5c06u\u6362\u6210u\u7684\u8def\u5f84\u6700\u9ad8\u70b9\u7684\u7236\u8282\u70b9\u3002\u3002\u3002\u7136\u540e\u5c31\u8fd9\u9012\u5f52\u4e0b\u53bb\u3002\u3002\u3002\u989d\u3002\u3002\u65f6\u95f4\u590d\u6742\u5ea6LogN\u3002\u3002\u9884\u5904\u7406\u590d\u6742\u5ea6\u662fO(N)\u7684\u3002\u3002\u5e38\u6570\u53c8\u6bd4\u7ebf\u6bb5\u6811\u90a3\u4e2a\u8981\u5c0f\u3002\u3002\u901f\u5ea6\u6bd4\u8bb0\u5f552^k\u7956\u5148\u90a3\u4e2a\u548c\u7ebf\u6bb5\u6811\u90fd\u8981\u5feb\u4e00\u4e9b\u3002\u3002\u6811\u94fe\u5256\u5206\u8fd8\u53ef\u4ee5\u5199Bfs..\u62d2\u7edd\u7206stack\u3002\u3002\u8fd8\u662f\u633a\u4e0d\u9519\u6ef4(*^__^*) \u563b\u563b\u3002\u3002\u3002Code\uff1a\uff08\u9898\u76ee\u662fUral\u4e0a\u7684Tree\uff09#include &lt;vector&gt;#include &lt;algorithm&gt;#include &lt;utility&gt;#include &lt;iostream&gt;#include &lt;cstdio&gt;#include &lt;cmath&gt;#include &lt;cstdlib&gt;#include &lt;set&gt;#include &lt;map&gt;#include &lt;cstring&gt;#include &lt;time.h&gt;#define rep(i,n) for(int i=0;i&lt;n;i++)#define pb push_back#define Debug(x) cout&lt;&lt;#x&lt;&lt;&quot;=&quot;&lt;&lt;x&lt;&lt;endl;#define For(i,l,r) for(int i=l;i&lt;=r;i++)#define tr(e,x) for(eit e=x.begin();e!=x.end();e++)#define printTime cout&lt;&lt;&quot;Time:&quot;&lt;&lt;pre-clock()&lt;&lt;endl;pre=clock();const int inf=~0U&gt;&gt;1,maxn=50000;using namespace std;int n,q;struct Edge{ int t,c; Edge(int _t,int _c):t(_t),c(_c){}};vector&lt;Edge&gt; E[maxn];typedef vector&lt;Edge&gt;::iterator eit;void AddEdge(int s,int t,int c){ E[s].pb(Edge(t,c)); E[t].pb(Edge(s,c));}void Init(){ scanf(&quot;%d&quot;,&amp;n);int s,t,c; rep(i,n-1) { scanf(&quot;%d%d%d&quot;,&amp;s,&amp;t,&amp;c); [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[10],"tags":[],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=\/wp\/v2\/posts\/321"}],"collection":[{"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=321"}],"version-history":[{"count":0,"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=\/wp\/v2\/posts\/321\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=321"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=321"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=321"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}