/**
程序实现功能:输入一组整数对,分别为父节点和子节点 如(0,1) (0,2) (1,3) (1,4) (3,5) (3,6) ,求形成的数的最长路径,本例中 levels=4

程序实现功能:输入一组整数对,分别为父节点和子节点 如(0,1) (0,2) (1,3) (1,4) (3,5) (3,6) ,求形成的数的最长路径,本例中 levels=4
实现方法:如果整数对集合中第二个数没有在第一个数组成的set中出现,说明该数为叶子节点,依次删掉叶子节点,不断将上一层根节点变成新的叶子节点,直到整数对为空集,所得层数加1即为最长路径(加1是最后一次去掉了两层的结点 eg,0->1)
**/
<span style="font-size:14px;"><span style="color:#000000;">#include <iostream>
#include <vector>
#include <set>
using namespace std;
int level(vector<pair<int,int> > &vec)
{
int length=vec.size();
static int levels=0;
set<int> root;
for(vector<pair<int,int> >::iterator it=vec.begin();it!=vec.end();it++) ///根结点set集合
root.insert(it->first);
while(length!=0)
{
vector<pair<int,int> >::iterator pt=vec.begin();
while(pt!=vec.end())
{
if(root.find(pt->second)!=root.end()) ///整数对第二个数没有出现在根节点set集合中,说明该整数对第二个数为叶子节点,需要删除
pt++;
else
pt=vec.erase(pt);
}
levels++; ///层数 levels++
root.clear();
for(vector<pair<int,int> >::iterator it=vec.begin();it!=vec.end();it++) ///剩下的整数对重新提取根节点(其实可以用差集运算减少运算量)
root.insert(it->first);
length=vec.size();
}
return levels+1; ///最后层数需要加1,算法实现到根节点时,一次性删除了两个结点
}
int main()
{
vector<pair<int,int> >test_vec;
cout<<"Enter the number:"<<endl;
int x,y;
while(cin>>x>>y)
{
test_vec.push_back(make_pair(x,y));
}
cout<<"There are "<<level(test_vec)<<" floors in these numbers."<<endl;
return 0;
}</span>
</span>