您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: