POJ_Nearest Common Ancestors
2016-06-02 14:08
253 查看
#include<iostream> #include<sstream> #include<string> #include<vector> #include<list> #include<set> #include<map> #include<stack> #include<queue> #include<algorithm> #include<cmath> #pragma warning(disable:4996) using namespace std; class Tree { public: map<int, int>edge; Tree(const int &node_num) { for (int i = 0; i != node_num-1; i++) { int parent, child; cin >> parent >> child; edge.insert(make_pair(child,parent)); } } vector<int>getAncestor(const int &node) { vector<int>ancestor; for (int i = node;true;i=edge[i]) { ancestor.push_back(i); if(edge.find(i)==edge.end()) { break; } } return ancestor; } int getLCA(const int &node1,const int &node2) { vector<int>ancestor1 = getAncestor(node1), ancestor2 = getAncestor(node2); for (size_t i = 0; i != ancestor1.size(); i++) { for (size_t j = 0; j != ancestor2.size(); j++) { if (ancestor1[i] == ancestor2[j]) { return ancestor1[i]; } } } return 0; } }; int main() { //freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); int T; cin >> T; while (T--) { int n; cin >> n; Tree tree(n); int node1, node2; cin >> node1 >> node2; cout << tree.getLCA(node1,node2) << endl; } return 0; }
#include<iostream> #include<sstream> #include<string> #include<vector> #include<list> #include<set> #include<map> #include<stack> #include<queue> #include<algorithm> #include<cmath> #pragma warning(disable:4996) using namespace std; class Tree { public: map<int, int>edge; vector<vector<int>>adjList; vector<int>depth; vector<int>isRoot; Tree(const int &node_num) { adjList.resize(node_num + 1); depth.resize(node_num + 1); isRoot.resize(node_num + 1,true); for (int i = 0; i != node_num-1; i++) { int parent, child; cin >> parent >> child; edge.insert(make_pair(child,parent)); adjList[parent].push_back(child); isRoot[child] = false; } for (int root = 1;true;root++) { if (isRoot[root]) { depth[root] = 1; DFS(root, 2); break; } } } void DFS(int i,int curDepath) { for (size_t j = 0; j != adjList[i].size(); j++) { depth[adjList[i][j]] = curDepath; DFS(adjList[i][j], curDepath+1); } } vector<int>getAncestor(const int &node) { vector<int>ancestor; for (int i = node;true;i=edge[i]) { ancestor.push_back(i); if(edge.find(i)==edge.end()) { break; } } return ancestor; } int getLCA(const int &node1,const int &node2) { int ancestor1 = node1, ancestor2 = node2; while (ancestor1 != ancestor2) { if (depth[ancestor1]<depth[ancestor2]) { ancestor2 = edge[ancestor2]; } else { ancestor1 = edge[ancestor1]; } } return ancestor1; } }; int main() { //freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); int T; cin >> T; while (T--) { int n; cin >> n; Tree tree(n); int node1, node2; cin >> node1 >> node2; cout << tree.getLCA(node1,node2) << endl; } return 0; }
相关文章推荐
- 并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法
- Codeforces Round #355 (Div. 2) B. Vanya and Food Processor
- shell基础知识
- IPC网络高清摄像机基础知识0(TI 海思 安霸方案分析“来自2014年”)
- ArrayAdapter
- Android学习(1)-TextLink
- fastdfs的使用命令
- f exists和if not exists关键字用法
- ionic 的 下拉刷新 与 上拉加载
- PHP 自 5.2 到 5.6 中新增的功能详解
- Java EE之JDBC技术
- WebSocket 实战
- eclipse批量替换单词
- java arrays methods
- springmvc重定向后jsp如何获取其中的flashAttribute?
- 钢铁侠 - 伊隆·马斯克(Elon Musk)
- [生产库实战] 采用存储过程对生产线历史表数据进行归档
- android透明UI欺骗的简单实现
- JAVA打包范例
- Java开发必会的Linux命令