POJ1470/ZOJ1141 Closest Common Ancestors(LCA離線演算法)

來源:互聯網
上載者:User

題意很明顯?真不覺的,我去啊,我是看了人家的翻譯才明白的,那傢伙,輸入格式相當銷魂啊……

大意是說,給出一棵樹(包含 N 個點),然後給出 M 次詢問,每次詢問都是兩個點的編號,他們一定有一個最近公用祖先,最後讓你輸出每個點被當做最近公用祖先的次數(是 0 次的話就不輸出了)。

很裸的 LCA離線 演算法,不過輸入有點小技巧,這裡我用的是多次使用 “%1s” 吸收掉括弧和冒號,不過
POJ 的討論版裡面也有很多不錯的方法,都很巧妙,可以去交流下

我寫 LCA離線 習慣是用數組儲存詢問,然後迴圈處理,說實話效率確實不怎麼的,跑了900ms+……汗啊……

看了別人用鏈表儲存詢問,然後遍曆鏈表的 LCA ,的確快好多啊,orz個……

PS:ZOJ上面這個題的詢問部分倆個點標號中間有逗號,切忌,相當坑爹啊……

代碼:

#include<cstdio>#include<cstring>const int N = 910;struct Edge{    int e,next;}edge[2*N];int n,m,e_num,head[N],vis[N],cnt[N];int x[N*N],y[N*N],f[N*N];void AddEdge(int a,int b){    edge[e_num].e=b; edge[e_num].next=head[a]; head[a]=e_num++;    edge[e_num].e=a; edge[e_num].next=head[b]; head[b]=e_num++;}int findx(int x){    if(f[x]!=x)return f[x]=findx(f[x]);    return f[x];}void tarjan(int k){    int i;    vis[k]=1;    f[k]=k;    for(i=1;i<=m;i++){//遍曆處理剛才儲存的 m 個詢問        if(x[i]==k && vis[y[i]])cnt[findx(y[i])]++;        if(y[i]==k && vis[x[i]])cnt[findx(x[i])]++;    }    for(i=head[k];i!=-1;i=edge[i].next){        if(!vis[edge[i].e]){            tarjan(edge[i].e);            f[edge[i].e]=k;        }    }}int main(){    int i,t,id,a,flag[N];    char ch1[2],ch2[2],ch3[2];    while(~scanf("%d",&n))    {        e_num=0;        for(i=1;i<=n;i++){            flag[i]=vis[i]=cnt[i]=0;            head[i]=-1;        }        for(i=1;i<=n;i++){            scanf("%d%1s%1s%d%1s",&id,ch1,ch2,&t,ch3);            while(t--){                scanf("%d",&a);                flag[a]=1;                AddEdge(id,a);            }        }        scanf("%d",&m);        for(i=1;i<=m;i++)            scanf("%1s%d%d%1s",ch1,&x[i],&y[i],ch2);        for(i=1;i<=n;i++)//注意,這裡,根節點不一定是 1            if(flag[i]==0)break;        tarjan(i);        for(i=1;i<=n;i++)            if(cnt[i])printf("%d:%d\n",i,cnt[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.