HIHO #1067 : 最近公共祖先·二(并查集+dfs LCA离线算法)
2016-08-09 19:19
357 查看
题目链接l
LCA 的算法还是有很多的,这里是并查集+dfs,是离线的算法
参考题目的提示,以及这个可以很好的理解
LCA 的算法还是有很多的,这里是并查集+dfs,是离线的算法
参考题目的提示,以及这个可以很好的理解
#include<cstdio> #include<algorithm> #include<iostream> #include<cstring> #include<string> #include<cmath> #include<queue> #include<map> #include<set> #include<cstdlib> #include<vector> using namespace std; #define cl(a,b) memset(a,b,sizeof(a)) #define LL long long #define pb push_back #define gcd __gcd #define For(i,j,k) for(int i=(j);i<k;i++) #define lowbit(i) (i&(-i)) #define _(x) printf("%d\n",x) const int maxn = 2e6+10; const int inf = 1 << 28; int id = 1; map<string,int> mp; map<int,string> tos; int getid(string s){ if(!mp.count(s)){ mp[s]=id; tos[id]=s; return id++; } return mp[s]; } struct node{ int index; int x; }; vector<node> query[maxn]; vector<int> G[maxn]; int f[maxn]; void init(int n){ for(int i=0;i<=n;i++){ f[i]=i; } } int find(int x){ if(x==f[x])return x; return f[x]=find(f[x]); } bool vis[maxn]; int ans[maxn]; void dfs(int u){ for(int i=0;i<G[u].size();i++){ int v = G[u][i]; dfs(v); f[v]=u; } vis[u]=true; for(int i=0;i<query[u].size();i++){ if(vis[query[u][i].x]){ ans[query[u][i].index] = find(query[u][i].x); } } } bool flag[maxn];// to get root of tree int main(){ int n;scanf("%d",&n); init(n); for(int i=0;i<n;i++){ string a,b;cin>>a>>b; int ida = getid(a); int idb = getid(b); flag[idb]=true; G[ida].pb(idb); } int m;scanf("%d",&m); for(int i=0;i<m;i++){ string a,b;cin>>a>>b; int u = getid(a); int v = getid(b); query[u].pb((node){i,v}); query[v].pb((node){i,u}); } int root = -1; for(int i=1;i<id;i++)if(!flag[i]){root=i;break;} dfs(root); for(int i=0;i<m;i++){ cout<<tos[ans[i]]<<endl; } return 0; }
相关文章推荐
- LCA(最近公共祖先)离线算法Tarjan+并查集
- 树上两点的最近公共祖先-Tarjan_LCA离线算法
- LCA(最近公共祖先)问题的离线算法
- LCA最近公共祖先的离线算法(Tarjan)和在线算法(ST)
- 树上两点的最近公共祖先-Tarjan_LCA离线算法
- POJ1986 DistanceQueries 最近公共祖先LCA 离线算法Tarjan
- Luogu 2245 星际导航(最小生成树,最近公共祖先LCA,并查集)
- LCA(最近公共祖先)问题的离线算法
- Tarjan离线算法求最近公共祖先(LCA)
- LCA最近公共祖先(tarjan离线算法)
- LCA(最近公共祖先)离线算法Tarjan
- [HIHO1062] 最近公共祖先·一(lca, 并查集, 二分, 神trick)
- POJ1470Closest Common Ancestors 最近公共祖先LCA 的 离线算法 Tarjan
- [笔记]LCA 最近公共祖先---tarjan离线算法
- LCA最近公共祖先 Tarjan离线算法
- Tarjan离线算法求最近公共祖先(LCA)
- hihocoder 1067 最近公共祖先·二(tarjan LCA 离线算法O(n))
- LCA(最近公共祖先)离线算法之tarjan
- LCA最近公共祖先 在线算法和离线算法 模板
- LCA(最近公共祖先)离线算法Tarjan+并查集