POJ 1470 Closest Common Ancestors 发表于 2016-08-06 | 分类于 LCA(最近公共祖先) | | 阅读次数 LCA模板题,但要注意scanf的用法。 题目链接POJ 1470 详解请见HDU 2586 附加AC代码我用的是LCA-RMQ-ST算法。 LCA-RMQ-ST算法详解123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130#include <set>#include <map>#include <stack>#include <cmath>#include <queue>#include <cstdio>#include <bitset>#include <string>#include <vector>#include <iomanip>#include <cstring>#include <iostream>#include <algorithm>#include <functional>#define maxn 1005using namespace std;struct node{ int x;};vector<node> V[maxn];int E[maxn * 2], D[maxn * 2], first[maxn],counter[maxn];int vis[maxn], dist[maxn], n, m, top = 1, root[maxn], st;int dp[30][maxn * 2];void init(){ top = 1; memset(root, 0, sizeof(root)); memset(vis, 0, sizeof(vis)); for (int i = 1; i <= n; i++) { V[i].clear(); } int k; node tmp; for (int i = 0; i < n; i++) { scanf("%d:(%d)",&m,&k); while(k--) { int a; scanf("%d",&a); tmp.x = a; V[m].push_back(tmp); tmp.x = m; V[a].push_back(tmp); root[a] = 1; } } for (int i = 1; i <= n; i++) if (root[i] == 0) { st = i; break; }}void dfs(int u, int dep){ vis[u] = 1, E[top] = u, D[top] = dep, first[u] = top++; for (int i = 0; i < V[u].size(); i++) if (!vis[V[u][i].x]) { int v = V[u][i].x; dfs(v, dep + 1); E[top] = u, D[top++] = dep; }}void ST(int num){ for (int i = 1; i <= num; i++) { dp[0][i] = i; } for (int i = 1; i <= log2(num); i++) for (int j = 1; j <= num; j++) if (j + (1 << i) - 1 <= num) { int a = dp[i - 1][j], b = dp[i - 1][j + (1 << i >> 1)]; if (D[a] < D[b]) { dp[i][j] = a; } else { dp[i][j] = b; } }}int RMQ(int x, int y){ int k = (int) log2(y - x + 1.0); int a = dp[k][x], b = dp[k][y - (1 << k) + 1]; if (D[a] < D[b]) { return a; } return b;}int main (){ while(scanf("%d", &n)!=EOF) { init(); memset(counter,0,sizeof(counter)); dfs(st, 0); ST(top); int x, y; int o; cin>>o; while(o--) { scanf(" (%d %d)", &x, &y);//注意双引号后的空格不能少 int a = first[x], b = first[y]; if (a > b) { swap(a, b); } int pos = RMQ(a, b); counter[E[pos]]++; } for(int i=1;i<=maxn;i++) { if(counter[i]!=0) { printf("%d:%d\n",i,counter[i]); } } } return 0;} 坚持原创技术分享,您的支持将鼓励我继续创作! 赏 微信打赏 支付宝打赏