实现方法:如果整数对集合中第二个数没有在第一个数组成的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>