求一组整数对形成的树的最长路径

本文介绍了一种通过不断移除叶子节点来计算给定树形结构中最长路径的算法。该方法适用于输入为一系列整数对的情况,每对整数代表树中一个节点的父子关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
程序实现功能:输入一组整数对,分别为父节点和子节点   如(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>






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值