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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

poj 1470(简单LCA 倍增法)

發布時間:2025/3/21 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj 1470(简单LCA 倍增法) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:給你一個樹,有若干個詢問,然后讓你統計每個結點在詢問中做了幾次LCA。按照結點順序輸出。

思路:這也是簡單的LCA題目,我用的是倍增法。每次查詢在相應結點標記上++,最后輸出即可。這道題的輸入處理比較煩,而且第一個輸入的結點并不是根節點。這要注意一下

代碼如下:

1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cmath> 5 #include <cstring> 6 #include <algorithm> 7 #include <queue> 8 #include <stack> 9 #include <vector> 10 #include <set> 11 #include <map> 12 #define MP(a, b) make_pair(a, b) 13 #define PB(a) push_back(a) 14 15 using namespace std; 16 17 typedef long long ll; 18 typedef pair<int ,int> pii; 19 typedef pair<unsigned int, unsigned int> puu; 20 typedef pair<int ,double> pid; 21 typedef pair<ll, int> pli; 22 23 const int INF = 0x3f3f3f3f; 24 const double eps = 1e-6; 25 const int LEN = 1000+10; 26 const int LOG_LEN = 100; 27 vector<int> Map[LEN]; 28 int root, parent[LOG_LEN][LEN], depth[LEN], ind[LEN]; 29 30 void dfs(int v, int p, int d){ 31 parent[0][v] = p; 32 depth[v] = d; 33 for(int i=0; i<Map[v].size(); i++){ 34 if(Map[v][i] != p) dfs(Map[v][i], v, d+1); 35 } 36 } 37 38 void init(int n){ 39 dfs(root, -1, 0); 40 for(int k=0; k+1<LOG_LEN; k++){ 41 for(int v=1; v<=n; v++){ 42 if(parent[k][v] < 0) parent[k+1][v] = -1; 43 else parent[k+1][v] = parent[k][parent[k][v]]; 44 } 45 } 46 } 47 48 int lca(int u, int v){ 49 if(depth[u] > depth[v])swap(u,v); 50 for(int k=0; k < LOG_LEN; k++){ 51 if((depth[u] - depth[v]) >> k & 1) v = parent[k][v]; 52 } 53 if(u==v) return u; 54 for(int k=LOG_LEN-1; k>=0; k--){ 55 if(parent[k][v] != parent[k][u]){ 56 u = parent[k][u]; 57 v = parent[k][v]; 58 } 59 } 60 return parent[0][u]; 61 } 62 63 int main() 64 { 65 // freopen("in.txt", "r", stdin); 66 67 int n, a, b, tn, q; 68 while(scanf("%d", &n)!=EOF){ 69 for(int i=0; i<LEN; i++)Map[i].clear(); 70 memset(ind, 0, sizeof ind); 71 for(int i=1; i<=n; i++){ 72 scanf("%d:(%d)", &a, &tn); 73 for(int j=0; j<tn; j++){ 74 scanf("%d", &b); 75 Map[a].PB(b); 76 Map[b].PB(a); 77 ind[b]++; 78 } 79 } 80 for(int i=1; i<=n; i++)if(!ind[i]){root = i;break;} 81 memset(ind, 0, sizeof ind); 82 init(n); 83 scanf("%d", &q); 84 for(int i=0; i<q; i++){ 85 while(getchar() != '('); 86 scanf("%d%d", &a, &b); 87 while(getchar() != ')'); 88 ind[lca(a, b)] ++; 89 } 90 for(int i=1; i<=n; i++){ 91 if(!ind[i])continue; 92 printf("%d:%d\n", i, ind[i]); 93 } 94 } 95 return 0; 96 } View Code

?

轉載于:https://www.cnblogs.com/shu-xiaohao/p/3529693.html

總結

以上是生活随笔為你收集整理的poj 1470(简单LCA 倍增法)的全部內容,希望文章能夠幫你解決所遇到的問題。

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