HDU2586 How far away ?(LCA離線演算法)

來源:互聯網
上載者:User

LCA(最近公用祖先)的離線演算法,用到的是 tarjan 的思想,並用並查集標記父親節點。

說說我的理解:

我們從根開始深搜遍曆樹,每當回溯到一個節點時,那就意味著我們已經完成了該節點子樹的遍曆,顯然這個節點就是子樹中點以及其本身的最近公用祖先,以此類推到整個樹。這裡非常巧妙的一點是,對於一個點,只有完成了其子樹的遍曆,我們才改變其 父節點 的值(賦初值為father[ i ] = i),這樣,對於每次詢問(就是給出兩點標號,要求求出兩點間最短距離,算一次詢問。假設為 A 和 B),我們搜到 A (或B)時,如果 B (或A)已經被訪問過,那麼向上回溯,直到第一個 父節點 已經改變的點,就是包括點 A 和點
B 在內子樹的根,這就是我們要找的 A 和 B 的最近公用祖先。

推薦自己畫圖手動實現一下,或者自己出資料用單步調試跟蹤一下,瞭解一下遞迴過程。

ps:參照http://www.cnblogs.com/ylfdrib/archive/2010/11/03/1867901.html

代碼:

#include<cstdio>#include<cstring>const int N = 40001;struct Edge{int e,v;int next;}edge[2*N];int n,m,e_num,head[N];int x[N],y[N],z[N],f[N],dist[N],vis[N];void AddEdge(int a,int b,int c){edge[e_num].e=b; edge[e_num].v=c; edge[e_num].next=head[a]; head[a]=e_num++;edge[e_num].e=a; edge[e_num].v=c; edge[e_num].next=head[b]; head[b]=e_num++;}int find(int x){if(f[x]!=x)return f[x]=find(f[x]);return f[x];}void tarjan(int k){int i;vis[k]=1;f[k]=k;for(i=1;i<=m;i++){//m次詢問,z[i]儲存的是點 x[i] 和 y[i] 最近公用祖先if(x[i]==k && vis[y[i]]) z[i]=find(y[i]);if(y[i]==k && vis[x[i]]) z[i]=find(x[i]);}for(i=head[k];i!=-1;i=edge[i].next){if(!vis[edge[i].e]){dist[edge[i].e]=dist[k]+edge[i].v;tarjan(edge[i].e);f[edge[i].e]=k;}}}int main(){int t,a,b,c,i;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);e_num=0;memset(head,-1,sizeof(head));for(i=1;i<n;i++){scanf("%d%d%d",&a,&b,&c);AddEdge(a,b,c);}for(i=1;i<=n;i++){x[i]=y[i]=z[i]=0;}for(i=1;i<=m;i++){scanf("%d%d",&a,&b);x[i]=a; y[i]=b;}memset(vis,0,sizeof(vis));dist[1]=0;tarjan(1);for(i=1;i<=m;i++)printf("%d\n",dist[x[i]]+dist[y[i]]-2*dist[z[i]]);}return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.