日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Tarjan求lca

發布時間:2023/12/18 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Tarjan求lca 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

https://vjudge.net/problem/POJ-1330

是到水的題,簡單點在于其只需求一對lca即可,這是比較簡單的。

主要看了以下blog

http://blog.csdn.net/hnust_xiehonghao/article/details/9109295

要點在于

1.用并查集維護。

2.必須是離線的,在線不行。

3.存邊可以用vector,比較方便,畢竟邊不多。

*4.rank可以實現啟發式并查集,可以優化一些時間。

5.anse數組是存祖先的,因為并查集維護,所以只需一步更新即可。

1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cmath> 5 #include<string> 6 #include<cstring> 7 #include<vector> 8 const int size=10007; 9 10 int n,f[size],anse[size],in[size],rank[size],vis[size]; 11 using namespace std; 12 vector<int> node[size],que[size]; 13 void init(); 14 int find(int num); 15 void conbine(int aa,int bb); 16 void lca(int root) 17 { 18 int i,sz; 19 anse[root]=root; 20 sz=node[root].size(); 21 for (int i=0;i<sz;i++) 22 { 23 // if (fa!=node[root][i]) 24 // { 25 lca(node[root][i]); 26 conbine(root,node[root][i]); 27 anse[find(node[root][i])]=root; 28 // } 29 } 30 vis[root]=1; 31 sz=que[root].size(); 32 for (int i=0;i<sz;i++) 33 { 34 if (vis[que[root][i]]) 35 { 36 printf("%d\n",anse[find(que[root][i])]); 37 return; 38 } 39 } 40 } 41 int main() 42 { 43 int cas,i; 44 scanf("%d",&cas); 45 while (cas--) 46 { 47 int x,y; 48 scanf("%d",&n); 49 init(); 50 for (int i=1;i<=n-1;i++) 51 { 52 scanf("%d%d",&x,&y); 53 node[x].push_back(y); 54 in[y]++; 55 } 56 scanf("%d%d",&x,&y); 57 que[x].push_back(y); 58 que[y].push_back(x); 59 for (y=1;y<=n;y++) 60 { 61 if (in[y]==0) break; 62 } 63 lca(y); 64 } 65 } 66 void init() 67 { 68 int i; 69 for (int i=1;i<=n;i++) 70 { 71 node[i].clear(); 72 que[i].clear(); 73 f[i]=i; 74 rank[i]=1; 75 } 76 memset(vis,0,sizeof(vis)); 77 memset(in,0,sizeof(in)); 78 memset(anse,0,sizeof(anse)); 79 } 80 int find(int num) 81 { 82 if (f[num]!=num) f[num]=find(f[num]); 83 return f[num]; 84 } 85 void conbine(int aa,int bb) 86 { 87 int x=find(aa),y=find(bb); 88 if (x==y) return; 89 if (rank[x]<=rank[y]) 90 { 91 f[x]=y; 92 rank[y]+=rank[x]; 93 } 94 else 95 { 96 f[y]=x; 97 rank[x]+=rank[y]; 98 } 99 }

求在線算法要用倍增lca

轉載于:https://www.cnblogs.com/fengzhiyuan/p/6775445.html

總結

以上是生活随笔為你收集整理的Tarjan求lca的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。