Tarjan算法_LCA
生活随笔
收集整理的這篇文章主要介紹了
Tarjan算法_LCA
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
參考資料:Tarjan算法_LCA??tarjan算法求LCA??Tarjan 算法&模板
只是對其中的代碼進行一下注釋,如有錯誤還得回來再改。
?
//不怕別人比你聰明,就怕別人比你聰明還比你努力 #include<iostream> #include<string> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> #include <set> #include <stack> #include <map> #include<vector> #define INF 0x3f3f3f3fusing namespace std; const int MAXN = 10005; vector<int> vec[MAXN]; bool vis[MAXN]; int per[MAXN],head[MAXN],in_num[MAXN]; //in_num統計每個點的入度,為了求根節點,per和并查集中的作用相同,head配合結構體前向星 int cnt,n,m;//感覺Node struct Node {int c,next; }edge[MAXN];void Init() {cnt = 0;memset(in_num,0,sizeof(in_num));memset(head,-1,sizeof(head));memset(vis,0,sizeof(vis));for(int i =1;i <= n;i++){vec[i].clear();per[i] = i;} }void add(int x,int y) {edge[++cnt].next = head[x];edge[cnt].c = y;head[x] = cnt; }int Find(int x) {if(per[x] != x)per[x] = Find(per[x]);return per[x]; }void Union(int x,int y) {x = Find(x);y = Find(y);if(x == y)return ;per[x] = y; }void Tarjan(int x) {for(int i = head[x];i != -1; i =edge[i].next){int v = edge[i].c;Tarjan(v);Union(v,x);//首先要一直遍歷的葉子節點 ??? }vis[x] = 1; // 當這個節點的所有子節點都已經遍歷到了,就標記這個節點for(int i = 0;i < vec[x].size();i ++)if(vis[vec[x][i]])//然后在問題中尋找是否有關于這兩個節點都已經標記過的了printf("%d 和 %d 的LAC是 %d\n",x,vec[x][i],Find(vec[x][i])); } int main() {int x,y;scanf("%d%d",&n,&m);Init();for(int i = 1;i < n;i++){scanf("%d%d",&x,&y);add(x,y);in_num[y] ++;}for(int i = 0;i < m;i ++){scanf("%d%d",&x,&y);vec[x].push_back(y);vec[y].push_back(x);}int root;for(int i = 1;i <= n;i ++)if(in_num[i] == 0)root = i;Tarjan(root); } /** 8 4 1 2 1 3 2 4 2 5 4 7 5 8 3 6 7 8 5 6 5 2 4 6 **/
?
轉載于:https://www.cnblogs.com/bright-mark/p/9588633.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Tarjan算法_LCA的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: H5学习从0到1-H5的基本标签(2)
- 下一篇: IBM MR10i阵列卡配置Raid0/