ZOJ_Utopia_?

来源:互联网 发布:网络代理销售合作协议 编辑:程序博客网 时间:2024/06/07 00:40
#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<bool>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;auto iter = edge.find(child);if (iter == edge.end()){edge.insert(make_pair(child, parent));}else{edge.insert({parent,child});}adjList[parent].push_back(child);isRoot[child] = false;}for (int root = 0; 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);}}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 getDist(const int &node1, const int &node2){return depth[node1] + depth[node2] - 2 * depth[getLCA(node1,node2)];}};int main(){//freopen("input.txt", "r", stdin);  //freopen("output.txt", "w", stdout);  int n,count=0;while (cin >> n){if (count){cout << endl;}printf("Case %d:\n",++count);Tree tree(n);int m; cin >> m;while (m--){int A, B, C; cin >> A >> B >> C;if (tree.getDist(A,C)+tree.getDist(B,C)==tree.getDist(A,B)){cout << "Yes" << endl;}else{cout << "No" << endl;}}}return 0;}

0 0
原创粉丝点击