#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;
}
ZOJ_Utopia_?
最新推荐文章于 2020-06-01 09:31:30 发布