poj1330Nearest Common Ancestors 1470 Closest Common Ancestors(LCA算法)

LCA思想:http://www.cnblogs.com/hujunzheng/p/3945885.html

在求解最近公共祖先為問題上,用到的是Tarjan的思想,從根結點開始形成一棵深搜樹,非常好的處理技巧就是在回溯到結點u的時候,u的子樹已經遍歷,這時候才把u結點放入合并集合中,
這樣u結點和所有u的子樹中的結點的最近公共祖先就是u了,u和還未遍歷的所有u的兄弟結點及子樹中的最近公共祖先就是u的父親結點。以此類推。。這樣我們在對樹深度遍歷的時候就很自然的將樹中的結點分成若干的集合,兩個集合中的所屬不同集合的任意一對頂點的公共祖先都是相同的,也就是說這兩個集合的最近公共最先只有一個。對于每個集合而言可以用并查集來優化,時間復雜度就大大降低了,為O(n + q),n為總結點數,q為詢問結點對數。

 1 /*
 2     題意很明顯,就是求LCA!
 3 */
 4 #include<iostream>
 5 #include<cstdio>
 6 #include<cstring>
 7 #include<algorithm>
 8 #include<vector>
 9 #define N 10005
10 using namespace std;
11 
12 int n;
13 int x, y;
14 vector<int>g[N];
15 int f[N];
16 int vis[N], cnt[N];
17 int ret;
18 
19 int getFather(int x){
20    return x==f[x] ? x : f[x]=getFather(f[x]);
21 }
22 
23 bool LCA(int u){
24     vis[u]=1;
25     f[u]=u;
26     int len=g[u].size();
27     
28     if(u==x && vis[y]){
29         ret=getFather(y);
30         return true;
31     }
32 
33     else if(u==y && vis[x]){
34         ret=getFather(x);
35         return true;
36     }
37 
38     for(int i=0; i<len; ++i){
39         int v=g[u][i];
40         if(!vis[v]){
41             if(LCA(v)) return true;
42             f[v]=u;
43         }
44     }
45     return false;
46 }
47 
48 int main(){
49     int t;
50     scanf("%d", &t);
51     while(t--){
52         scanf("%d", &n);
53         memset(cnt, 0, sizeof(cnt));
54         for(int i=1; i<n; ++i){
55             int u, v;
56             scanf("%d%d", &u, &v);
57             g[u].push_back(v);
58             ++cnt[v];
59         }
60         memset(vis, 0, sizeof(vis));
61         scanf("%d%d", &x, &y);
62         for(int i=1; i<=n; ++i)
63             if(cnt[i]==0){
64                 LCA(i);
65                 break;
66             }
67         printf("%d\n", ret);
68         for(int i=1; i<=n; ++i)
69             g[i].clear();
70     }
71     return 0;
72 }
73  
View Code
 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<algorithm>
 5 #include<vector>
 6 #define N 905
 7 #define M 25000
 8 using namespace std;
 9 
10 vector<int>g[N];
11 vector<int>p[M];
12 int cnt[N];
13 int f[N];
14 int vis[N];
15 int ans[N];
16 
17 int n, m;
18 
19 int getFather(int x){
20    return x==f[x] ? x : f[x]=getFather(f[x]);
21 }
22 
23 void LCA(int u){
24     f[u]=u;
25     vis[u]=1;
26     int len;
27     
28     len=p[u].size();
29     for(int i=0; i<len; ++i){
30         int v=p[u][i];
31         if(vis[v])
32               ++ans[getFather(v)];
33     }
34     
35     len=g[u].size();
36     for(int i=0; i<len; ++i){
37            int v=g[u][i];
38            if(!vis[v]){
39             LCA(v);
40             f[v]=u;   
41         }
42     }
43 }
44 
45 int main(){
46       while(scanf("%d", &n)!=EOF){
47             memset(cnt, 0, sizeof(cnt));
48           for(int i=1; i<=n; ++i){
49                   vis[i]=0;
50                   ans[i]=0;
51                   int a, d, b;
52                   char ch;
53                   scanf("%d", &a);
54                   while(scanf("%c", &ch) && ch!='(');
55                   scanf("%d", &d);
56                   while(scanf("%c", &ch) && ch!=')');
57                   while(d--){
58                    scanf("%d", &b);
59                    ++cnt[b];
60                    g[a].push_back(b);
61                 }
62           }
63           scanf("%d", &m);
64           while(m--){
65                char ch;
66              while(scanf("%c", &ch) && ch!='(');
67              int u, v;
68              scanf("%d%d", &u, &v);
69              p[u].push_back(v);
70              p[v].push_back(u);
71              while(scanf("%c", &ch) && ch!=')');
72           }
73 
74           for(int i=1; i<=n; ++i)
75              if(cnt[i]==0){
76                 LCA(i);
77                 break;
78             }
79          for(int i=1; i<=n; ++i)
80             if(ans[i]!=0)
81                 printf("%d:%d\n", i, ans[i]);
82                 
83          for(int i=1; i<=n; ++i)
84             g[i].clear(), p[i].clear();
85     }
86     return 0;
87 }
View Code

?

轉載于:https://www.cnblogs.com/hujunzheng/p/3945593.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/531699.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531699.shtml
英文地址,請注明出處:http://en.pswp.cn/news/531699.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LCA算法的理解

LCA思想&#xff1a;在求解最近公共祖先為問題上&#xff0c;用到的是Tarjan的思想&#xff0c;從根結點開始形成一棵深搜樹&#xff0c;非常好的處理技巧就是在回溯到結點u的時候&#xff0c;u的子樹已經遍歷&#xff0c;這時候才把u結點放入合并集合中&#xff0c; 這樣u結點…

java連加密的mysql_Java 實現加密數據庫連接

一、前言在很多項目中&#xff0c;數據庫相關的配置文件內容都是以明文的形式展示的&#xff0c;這存在一定的安全隱患。在開發和維護項目時&#xff0c;不僅要關注項目的性能&#xff0c;同時也要注重其安全性。二、實現思路我們都知道項目啟動時&#xff0c;Spring 容器會加載…

codeforces Gargari and Bishops(很好的暴力)

1 /*2 題意&#xff1a;給你一個n*n的格子&#xff0c;每一個格子都有一個數值&#xff01;將兩只bishops放在某一個格子上&#xff0c;3 每一個bishop可以攻擊對角線上的格子&#xff08;主對角線和者斜對角線&#xff09;&#xff0c;然后會獲得格子上的4 數值&a…

java詞匯速查手冊_java 詞匯表速查手冊

Abstract class 抽象類:抽象類是不允許實例化的類&#xff0c;因此一般它需要被進行擴展繼承。Abstract method 抽象方法:抽象方法即不包含任何功能代碼的方法。Access modifier 訪問控制修飾符:訪問控制修飾符用來修飾Java中類、以及類的方法和變量的訪問控制屬性。Anonymous …

codeforces Gargari and Permutations(DAG+BFS)

1 /*2 題意&#xff1a;求出多個全排列的lcs&#xff01;3 思路&#xff1a;因為是全排列&#xff0c;所以每一行的每一個數字都不會重復&#xff0c;所以如果有每一個全排列的數字 i 都在數字 j的前面&#xff0c;那么i&#xff0c; j建立一條有向邊&#xff01;4 …

hdu4292Food(最大流Dinic算法)

/*    題意&#xff1a;每一個人都有喜歡的吃的和喝的&#xff0c;每一個人只選擇一個數量的吃的和一個數量的喝的&#xff0c;問能滿足最多的人數&#xff01;&#xff1f;    思路&#xff1a;建圖很是重要&#xff01;f-food, p-people, d-drink    建圖&#x…

python3.5 連接mysql_python3.5 連接mysql本地數據庫

前期準備工作&#xff1a;安裝python的模塊&#xff0c;網上大部分讓安裝mysqldb模塊&#xff0c;但是會報錯&#xff0c;原因是python3.5不被其支持&#xff1a;請看該鏈接 我們也可以這樣解決&#xff1a;直接執行&#xff1a;sudo pip3 install pymysql;在python3中輸入impo…

java異常順序_網易新聞

public class SmallT {public static void main(String args[]) {SmallT t new SmallT();int b t.get();System.out.println(b);}public int get() {try {return 1;} finally {return 2;}}}返回的結果是2。我可以通過下面一個例子程序來幫助我解釋這個答案&#xff0c;從下面…

java中自動裝箱的問題

package wrapper;public class WrapperDemo {public static void main(String[] args) {Integer anew Integer(5);Integer bnew Integer(5);System.out.println(ab);System.out.println(a.equals(b));/*falsetrue*/Integer c127;//屬于自動裝箱Integer d127;//jdk1.5以后&#…

下載國外網站資料需java_Java開發必知道的國外10大網站

1、https://www.google.com/不解釋2、https://stackoverflow.com里面包含各種開發遇到的問題及答案&#xff0c;質量比較高。3、https://github.com/免費的開源代碼托管網站&#xff0c;包括了許多開源的項目及示例項目等。4、https://dzone.com/提供技術新聞、編程教程、及各種…

poj 1950 Dessert(dfs枚舉,模擬運算過程)

/*   這個代碼運行的時間長主要是因為每次枚舉之后都要重新計算一下和的值&#xff01;    如果要快的話&#xff0c;應該在dfs&#xff0c;也就是枚舉的過程中計算出前邊的數值&#xff08;這種方法見第二個代碼&#xff09;&#xff0c;直到最后&#xff0c;這樣不必每…

poj1949Chores(建圖或者dp)

1 /*2 題意&#xff1a;n個任務&#xff0c;有某些任務要在一些任務之前完成才能開始做&#xff01;3 第k個任務的約束只能是1...k-1個任務&#xff01;問最終需要最少的時間完成全部的 4 任務&#xff0…

java 空數組如何判斷,java判斷數組是否為空

java判斷數組是否為空根據數組長度判斷&#xff0c;如果為0&#xff0c;則為空&#xff0c;反之不是。 (推薦學習&#xff1a;java課程)public class Main {public static void main(String[] args) {int[] array1 new int[]{}; //被當成 {0}if (array1 null) {System.out.pr…

2014牡丹江網絡賽ZOJPretty Poem(暴力枚舉)

/*   將給定的一個字符串分解成ABABA 或者 ABABCAB的形式&#xff01; 思路&#xff1a;暴力枚舉A, B, C串&#xff01; */ 1 #include<iostream>2 #include<cstring>3 #include<cstdio>4 #include<string>5 6 using namespace std;7 str…

php switch goto,PHP goto語句用法實例

問題當 PHP 在執行代碼過程&#xff0c;在某一時刻我們希望它能跳轉到某一特定位置繼續執行代碼&#xff0c;該怎么做呢&#xff1f;回答在 PHP 中&#xff0c;我們可以使用 goto 操作符來使 PHP 代碼執行器跳轉到程序中某一特定位置。goto 的使用有一定限制&#xff0c;如&…

php curl cookie,php中curl獲取返回頁面的cookie

php的curl可以模仿用戶瀏覽網頁并且獲取網頁的cookie,獲取cookie還有專用的參數如CURLOPT_COOKIEJAR 用于保存 cookie 到文件了,下面一起來看幾個例子吧.curl可以獲取返回頁面設置的cookie,原理跟get_headers是一樣的,在返回的頭信息中將"Set-Cookie:"的內容取出來即…

php訪問網頁post獲取源碼,第一次抓別人網站數據,用postman直接請求可以獲取到返回數據,通過代碼的方式就一直報錯,php...

最近需要抓取下KFC的一些數據通過postman把請求地址和參數都拿過來后可以返回數據我就天真的以為可以通過代碼直接發送一個post請求即可但是通過php的curl模擬請求后&#xff0c;返回的一直是服務器異常剛開始時好像成功過&#xff0c;但現在一直都是報這個&#xff0c;我用的就…

c++中關于初始化型參列表的一些問題

1 /*2 1.成員是按照他們在類中出現的順序進行初始化的&#xff0c;而不是按照他們在初始化列表出現的順序初始化的!3 一個好的習慣是&#xff0c;按照成員定義的順序進行初始化。4 2.數組成員在初始化型參列表中不正確 5 */6 #include<iostream>7 #include<cstdio&…

話術php源碼,戀愛話術寶典織夢源碼

戀愛話術寶典網頁版&#xff1a;http://vi.520menghuan.cn戀愛話術寶典app下載&#xff1a;https://www.lanzous.com/i2dmywd戀愛話術寶典app&#xff0c;里面有超過4萬條可復制聊天的戀愛聊天話術&#xff0c;這是一款經典的“智能代聊 APP”。花式套路小哥哥、小姐姐&#xf…

c++中基類與派生類中隱含的this指針的分析

先不要看結果&#xff0c;看一下你是否真正了解了this指針&#xff1f; 1 #include<iostream>2 using namespace std;3 4 class Parent{5 public:6 int x;7 Parent *p;8 public:9 Parent(){} 10 Parent(int x){ 11 …