{"id":119,"date":"2010-02-22T03:39:00","date_gmt":"2010-02-21T19:39:00","guid":{"rendered":"http:\/\/localhost\/?p=119"},"modified":"2010-02-22T03:39:00","modified_gmt":"2010-02-21T19:39:00","slug":"spoj_3978_distance_query","status":"publish","type":"post","link":"https:\/\/www.shuizilong.com\/wjmzbmr\/?p=119","title":{"rendered":"SPOJ 3978 Distance Query"},"content":{"rendered":"<p> Link\uff1a<a href=\"https:\/\/www.spoj.pl\/problems\/DISQUERY\/\" target=\"_blank\">Problem<\/a><br \/>\u5927\u610f\u662f\u7ed9\u4e00\u9897\u4ee3\u6743\u6811\u3002Q\u4e2a\u8be2\u95ee\u3002\u6bcf\u4e2a\u8be2\u95ee\u662f\u4e24\u4e2a\u8282\u70b9\u3002<br \/>\u8ba9\u4f60\u56de\u7b54\u8fd9\u4e24\u4e2a\u8282\u70b9\u4e4b\u95f4\u8def\u5f84\u4e0a\u7684\u6700\u957f\u8fb9\u548c\u6700\u77ed\u8fb9\u3002<br \/>\u8ddfPKU\u6708\u8d5b\u7684\u67d0\u9898\u6709\u70b9\u50cf\u3002<br \/>\u4f7f\u7528\u79bb\u7ebf\u7b97\u6cd5\u7c7btarjan\u7b97\u6cd5\u3002<br \/>\u5728\u5e76\u67e5\u96c6\u4e2d\u5bf9\u6bcf\u4e2a\u8282\u70b9\u7ef4\u62a4\u4e00\u4e2a\u5230\u7236\u4eb2\uff08\u5e76\u67e5\u96c6\u4e2d\u7684\u7236\u4eb2\uff09\u7684\u8def\u5f84\u4e0a\u6700\u957f\u548c\u6700\u77ed\u7684\u8fb9\u3002\u3002<br \/>\u90a3\u4e48\u5728\u8def\u5f84\u538b\u7f29\u7684\u65f6\u5019\u4e5f\u53ef\u4ee5\u987a\u4fbf\u5408\u5e76\u3002\u3002<br \/>\u5728\u6c42\u51fa\u4e24\u4e2a\u8282\u70b9\u4e4b\u95f4\u7684lca\u4e4b\u540e\u3002\u3002\u7b49dfs\u56de\u5230\u4e86\u8fd9\u4e2alca\u3002\u3002\u5c31\u6709\u5145\u5206\u7684\u4fe1\u606f\u4e86\u3002\u3002<br \/>\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684\u8ba1\u7b97\u7b54\u6848<br \/>PS\u6211\u592a\u4f9d\u8d56stl\u4e86\u3002\u3002\u8fd9\u6837\u4e0b\u53bb\u600e\u4e48\u884c<img decoding=\"async\" src=\"http:\/\/wjmzbmr.com\/wp-content\/uploads\/pic\/other_site\/img_baidu_j_0013.gif\" \/><img decoding=\"async\" src=\"http:\/\/wjmzbmr.com\/wp-content\/uploads\/pic\/other_site\/img_baidu_j_0012.gif\" \/><br \/>Code\uff1a<\/p>\n<p>#include&lt;cstdio&gt;<br \/>#include&lt;vector&gt;<br \/>#include&lt;algorithm&gt;<br \/>#include&lt;iostream&gt;<br \/>#define pb push_back<br \/>#define rep(i,n) for(int i=0;i&lt;n;i++)<br \/>using namespace std;<br \/>const int inf=~0U&gt;&gt;1;<br \/>const int maxn=100000;int n;<br \/>const int maxm=maxn;int m;<br \/>struct edge<br \/>{<br \/>    int t,c;<br \/>    edge(int _t,int _c):t(_t),c(_c){}<br \/>};<br \/>struct queryLca<br \/>{<br \/>    int t,n;<br \/>    queryLca(int _t,int _n):t(_t),n(_n){}<br \/>};<br \/>struct query<br \/>{<br \/>    int a,b,n;<br \/>    query(int _a,int _b,int _n):a(_a),b(_b),n(_n){}<br \/>};<br \/>struct info<br \/>{<br \/>    int Min,Max;<br \/>    info():Min(inf),Max(-inf){}<br \/>    info(int v):Min(v),Max(v){}<br \/>    void print() const{cout&lt;&lt;&quot;{&quot;&lt;&lt;Min&lt;&lt;&quot;,&quot;&lt;&lt;Max&lt;&lt;&quot;}&quot;;}<br \/>    void Merge(const info&amp; o)<br \/>    {<br \/>        \/\/print();cout&lt;&lt;&quot; + &quot;;o.print();cout&lt;&lt;endl;<br \/>        Min=min(Min,o.Min);<br \/>        Max=max(Max,o.Max);<br \/>    }<br \/>};<br \/>vector&lt;edge&gt; E[maxn];<br \/>vector&lt;queryLca&gt; Lca[maxn];<br \/>vector&lt;query&gt; Query[maxn];<br \/>typedef vector&lt;edge&gt;::iterator eit;<br \/>typedef vector&lt;queryLca&gt;::iterator lit;<br \/>typedef vector&lt;query&gt;::iterator qit;<br \/>info Ans[maxm];<br \/>void add_edge(int s,int t,int c)<br \/>{<br \/>    E[s].pb(edge(t,c));<br \/>    E[t].pb(edge(s,c));<br \/>}<br \/>void add_lca(int s,int t,int n)<br \/>{<br \/>    Lca[s].pb(queryLca(t,n));<br \/>    Lca[t].pb(queryLca(s,n));<br \/>}<br \/>info P[maxn];<br \/>int F[maxn];<br \/>void set()<br \/>{<br \/>    rep(i,n) F[i]=i;<br \/>}<br \/>int find(int x)<br \/>{<br \/>    int tmp=F[x];<br \/>    if(F[x]!=x)<br \/>        F[x]=find(F[x]),P[x].Merge(P[tmp]);<br \/>    return F[x];<br \/>}<br \/>void Union(int i,int j,int c)<br \/>{<br \/>    F[j]=i;<br \/>    P[j]=info(c);<br \/>}<br \/>bool vis[maxn]={0};<br \/>void dfs(int x)<br \/>{<br \/>    vis[x]=true;\/\/cout&lt;&lt;x&lt;&lt;endl;<br \/>    for(eit i=E[x].begin();i!=E[x].end();i++)if(!vis[i-&gt;t])<br \/>        dfs(i-&gt;t),Union(x,i-&gt;t,i-&gt;c);<br \/>    for(lit i=Lca[x].begin();i!=Lca[x].end();i++)<br \/>    {<br \/>        if(vis[i-&gt;t])<br \/>        {<br \/>            Query[find(i-&gt;t)].pb(query(x,i-&gt;t,i-&gt;n));<br \/>            \/\/cout&lt;&lt;find(i-&gt;t)&lt;&lt;&quot; &quot;&lt;&lt;x&lt;&lt;&quot; &quot;&lt;&lt;i-&gt;t&lt;&lt;endl;<br \/>        }<br \/>    }<br \/>    for(qit i=Query[x].begin();i!=Query[x].end();i++)<br \/>    {<br \/>        find(i-&gt;a);find(i-&gt;b);<br \/>        info&amp;x=Ans[i-&gt;n];<br \/>        x=P[i-&gt;a];x.Merge(P[i-&gt;b]);<br \/>    }<br \/>}<br \/>void init()<br \/>{<br \/>    scanf(&quot;%d&quot;,&amp;n);int s,t,c;<br \/>    set();<br \/>    for(int i=0;i&lt;n-1;i++)<br \/>    {<br \/>        scanf(&quot;%d %d %d&quot;,&amp;s,&amp;t,&amp;c);<br \/>        add_edge(s-1,t-1,c);<br \/>    }<br \/>    scanf(&quot;%d&quot;,&amp;m);int a,b;<br \/>    for(int i=0;i&lt;m;i++)<br \/>    {<br \/>        scanf(&quot;%d %d&quot;,&amp;a,&amp;b);<br \/>        add_lca(a-1,b-1,i);<br \/>    }<br \/>}<br \/>void solve()<br \/>{<br \/>    dfs(0);<br \/>    for(int i=0;i&lt;m;i++)<br \/>        printf(&quot;%d %dn&quot;,Ans[i].Min,Ans[i].Max);<br \/>}<br \/>int main()<br \/>{<br \/>    \/\/freopen(&quot;in&quot;,&quot;r&quot;,stdin);<br \/>    \/\/freopen(&quot;out&quot;,&quot;w&quot;,stdout);<br \/>    init();<br \/>    solve();<br \/>}<br \/>\u672c\u9ad8\u4eae\u4ee3\u7801\u4f7f\u7528codeHl\u751f\u6210\uff0c<br \/>\u8bdd\u8bf4\u62113\u70b9\u534a\u4e86\u95f2\u7740\u65e0\u804a\u5c45\u7136\u5f00\u59cb\u5237\u9898\u4e86\u3002\u3002<img decoding=\"async\" src=\"http:\/\/wjmzbmr.com\/wp-content\/uploads\/pic\/other_site\/img_baidu_j_0011.gif\" \/> <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Link\uff1aProblem\u5927\u610f\u662f\u7ed9\u4e00\u9897\u4ee3\u6743\u6811\u3002Q\u4e2a\u8be2\u95ee\u3002\u6bcf\u4e2a\u8be2\u95ee\u662f\u4e24\u4e2a\u8282\u70b9\u3002\u8ba9\u4f60\u56de\u7b54\u8fd9\u4e24\u4e2a\u8282\u70b9\u4e4b\u95f4\u8def\u5f84\u4e0a\u7684\u6700\u957f\u8fb9\u548c\u6700\u77ed\u8fb9\u3002\u8ddfPKU\u6708\u8d5b\u7684\u67d0\u9898\u6709\u70b9\u50cf\u3002\u4f7f\u7528\u79bb\u7ebf\u7b97\u6cd5\u7c7btarjan\u7b97\u6cd5\u3002\u5728\u5e76\u67e5\u96c6\u4e2d\u5bf9\u6bcf\u4e2a\u8282\u70b9\u7ef4\u62a4\u4e00\u4e2a\u5230\u7236\u4eb2\uff08\u5e76\u67e5\u96c6\u4e2d\u7684\u7236\u4eb2\uff09\u7684\u8def\u5f84\u4e0a\u6700\u957f\u548c\u6700\u77ed\u7684\u8fb9\u3002\u3002\u90a3\u4e48\u5728\u8def\u5f84\u538b\u7f29\u7684\u65f6\u5019\u4e5f\u53ef\u4ee5\u987a\u4fbf\u5408\u5e76\u3002\u3002\u5728\u6c42\u51fa\u4e24\u4e2a\u8282\u70b9\u4e4b\u95f4\u7684lca\u4e4b\u540e\u3002\u3002\u7b49dfs\u56de\u5230\u4e86\u8fd9\u4e2alca\u3002\u3002\u5c31\u6709\u5145\u5206\u7684\u4fe1\u606f\u4e86\u3002\u3002\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684\u8ba1\u7b97\u7b54\u6848PS\u6211\u592a\u4f9d\u8d56stl\u4e86\u3002\u3002\u8fd9\u6837\u4e0b\u53bb\u600e\u4e48\u884cCode\uff1a #include&lt;cstdio&gt;#include&lt;vector&gt;#include&lt;algorithm&gt;#include&lt;iostream&gt;#define pb push_back#define rep(i,n) for(int i=0;i&lt;n;i++)using namespace std;const int inf=~0U&gt;&gt;1;const int maxn=100000;int n;const int maxm=maxn;int m;struct edge{ int t,c; edge(int _t,int _c):t(_t),c(_c){}};struct queryLca{ int t,n; queryLca(int _t,int _n):t(_t),n(_n){}};struct query{ int a,b,n; query(int _a,int _b,int _n):a(_a),b(_b),n(_n){}};struct info{ int Min,Max; info():Min(inf),Max(-inf){} info(int v):Min(v),Max(v){} void print() const{cout&lt;&lt;&quot;{&quot;&lt;&lt;Min&lt;&lt;&quot;,&quot;&lt;&lt;Max&lt;&lt;&quot;}&quot;;} void Merge(const info&amp; o) { \/\/print();cout&lt;&lt;&quot; + &quot;;o.print();cout&lt;&lt;endl; Min=min(Min,o.Min); Max=max(Max,o.Max); [&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\/119"}],"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=119"}],"version-history":[{"count":0,"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=\/wp\/v2\/posts\/119\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=119"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=119"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=119"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}