#include <iostream> #include <string> #include <map> #include <stack> #include <vector> using namespace std; map<string, string> represent; map<pair<string, string>, string> ans; pair<string, string> a[100005]; string find_represent(string x){ if (x == represent[x]) return x; else{ represent[x] = find_represent(represent[x]); return represent[x]; } } void unionset(string x, string y){ represent[find_represent(x)] = find_represent(y); } template <class T> class Node{ /* * This is a Tree Node class. */ public: T field, parent; vector<T> son; vector<T> query; string color; Node(T myfield){ field = myfield; son.clear(); query.clear(); parent = ""; color = "white"; } void add_query(T query_name){ query.push_back(query_name); } void add_child(T child){ son.push_back(child); } void set_parent(T sparent){ parent = sparent; } }; template <class T> class GenTree{ public: Node<T> *root; map<T, Node<T>* > nodes; GenTree(){} GenTree(T root_field){ root = new Node<T>(root_field); root->parent = root_field; nodes.insert(pair<T, Node<T>* >(root_field, root)); } Node<T>* add_node(T field, T parent = ""){ Node<T> *node = new Node<T>(field); nodes[field] = node; if (parent!= ""){ nodes[parent]->add_child(field); node->parent = parent; } else node->parent = field; return node; } void add_query(T field, T query_name){ nodes[field]->add_query(query_name); nodes[query_name]->add_query(field); } void traverse(T field){ stack<T> mystack; T temp_field; mystack.push(field); while (!mystack.empty()){ temp_field = mystack.top(); mystack.pop(); cout<<temp_field<<endl; if (nodes[temp_field]->son.size() != 0){ int size = nodes[temp_field]->son.size(); for (int i=size-1; i>=0; i--) mystack.push(nodes[temp_field]->son[i]); } cout<<temp_field<<endl; } } void dfs(T field){ int n = nodes[field]->son.size(); int size = nodes[field]->query.size(); string query_name, color, temp_name1, temp_name2; nodes[field]->color = "grey"; if (size != 0){ for (int i=0; i<size; i++){ temp_name1 = nodes[field]->query[i]; color = nodes[temp_name1]->color; if (color == "grey"){ ans[pair<string, string>(field, temp_name1)] = temp_name1; ans[pair<string, string>(temp_name1, field)] = temp_name1; } else if (color == "black"){ temp_name2 = find_represent(temp_name1); ans[pair<string, string>(field, temp_name1)] = temp_name2; ans[pair<string, string>(temp_name1, field)] = temp_name2; } } } if (n != 0){ for (int i=0; i<n; i++) { T cur_son = nodes[field]->son[i]; dfs(cur_son); } //cout<<field<<" "<<nodes[field]->color<<endl; nodes[field]->color = "black"; unionset(field, nodes[field]->parent); } else{ //cout<<field<<" "<<nodes[field]->color<<endl; nodes[field]->color = "black"; unionset(field, nodes[field]->parent); } } }; int main() { GenTree<string> mytree; int n, m; string name1, name2, root; cin>>n; for (int i=0; i<n; i++){ cin>>name1>>name2; represent[name1] = name1; represent[name2] = name2; if (i==0){ root = name1; mytree.add_node(name1); mytree.add_node(name2, name1); } else mytree.add_node(name2, name1); } cin>>m; for (int i=0; i<m; i++){ cin>>name1>>name2; mytree.add_query(name1, name2); a[i] = pair<string, string>(name1, name2); } mytree.dfs(root); for (int i=0; i<m; i++){ cout<<ans[a[i]]<<endl; } return 0; }
最后一个点过不去。。。
相关推荐
Tree_LCA---倍增
在【LCA-AW2.2.zip】这个压缩包中,我们可以找到名为“LCA-AW2.2”的程序或更新文件。这可能是该软件的最新版本,提供与官网同步的功能和性能。用户可以下载并安装此文件,将LCA软件设置为本地接口,这样可以避免...
资源分类:Python库 所属语言:Python 资源全名:rmnd-lca-0.1.6.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
本文档主要介绍了Linux中的进程间通信(IPC,Inter-Process Communication)机制,这是在多进程环境中进行进程间数据交换和协调的重要手段。作者Michael Kerrisk是Linux man-pages项目的维护者,他对Linux内核API和...
标题和描述提到的是“第4章 倍增求LCA-2019-12-05.pdf”,其中LCA代表的是“最近公共祖先”(Lowest Common Ancestor)。在计算机科学中,尤其是在图论和树形结构的算法中,最近公共祖先是一个基础且重要的概念。...
无标题ISO17387-LCA法规
在光谱分析中,LCA可以帮助识别局部的特征模式,尤其是在数据分布不均匀或者存在局部变化的情况下。 LLE(局部线性嵌入)同样是非线性降维技术,旨在保持数据点之间的局部几何结构。LLE通过找到每个数据点与其最近...
强大的日志收集智能分析系统-LCA之所有程序部署
图论--LCA--树上倍增法(在线) 图论--LCA--在线RMQ ST 最小环: 图论--最小环--Floyd模板 树的直径: 图论--树的直径--DFS+树形DP模板 树的重心: 图论--树的重心(DFS) 模板 生成树: ...
本篇讲解的焦点是最近公共祖先(LCA,Lowest Common Ancestor),这是一种在树中找到两个节点之间最深公共节点的问题。 首先,解决求两点距离的传统方法包括Floyd-Warshall算法和DFS(深度优先搜索)或BFS(广度...
这个压缩包文件"API-LCA-JonathanLynch-master"很可能包含了他的研究、代码示例或教程,旨在帮助开发者理解和实践API生命周期管理的最佳实践。 在C#环境中,API的开发通常使用.NET Framework或.NET Core,这两种...
lca_com-moonshot-kimichat-79-1729395647600-xd3.apk
lca_app-qvclean-release.apk-1-1663482275650.apk
lca_PE-V10.1.2-9015001.apk-1-1694594273570.bin
lca_futureve-app-market(zhihuwap)-release-9.1.0(15618)-armeabi-v7a-bangcle.apk-1-1682906954841.bin
lca_futureve-app-minor-release-8.41.0(13509)-armeabi-v7a-arm64-v8a-bangcle.apk-1-1668495200177.bin