d森林问题

本文介绍了一个基于贪心算法的森林分离程序,该程序读取文件中的森林结构数据,并通过计算找到最小分离集,使得森林中各树的根节点间的路径长度不超过预设值d。程序使用C++编写,涉及数据结构包括数组、文件输入输出等。

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

#include "iostream"
#include "fstream"
#include "queue"
using namespace std;

const int MAX = 50;
int parent[MAX]; //存储父结点
int leaf[MAX];  //存储叶子结点
int deg[MAX];   //存储顶点的出度
int parlen[MAX]; //parlen[i]表示i结点到父节点的距离
int cut[MAX];  //存储分离后子树的根结点
int dist[MAX];  //dist[i]表示结点i到叶结点的距离

//从叶结点到根结点移动
double greedy(int n, int d)
{
    int total = 0;
    int i;
    memset(cut, 0, sizeof(cut));
    memset(dist, 0, sizeof(dist));
    for(i=1; i<=leaf[0]; i++)
    {
        if(leaf[i]!=1) //如果不是根结点
        {
            int par = parent[leaf[i]];
            int len = parlen[leaf[i]];
            if(cut[par]<1 && dist[leaf[i]]+len>d) //如果路长超过d,且未分离
            {
                cut[par] = 1;
                par = parent[par];
                total++;
            }
            else if(cut[par]<1 && dist[par] < dist[leaf[i]] + len) //如果未超过d,且未分离
                dist[par] = len + dist[leaf[i]];  //更新父结点路长
            if(--deg[par]==0)   //如果出度边为0
                leaf[++leaf[0]] = par;
        }
    }
    return total;
}

int main()
{
    ifstream fin("d森林.txt");
    int n, d;
    cout << "输入树的顶点数:";
    fin >> n; cout << n;
    cout << "\n输入各边的情况:\n";
    int a, len;
    int i, j;
    leaf[0] = 0;
    for(i=1; i<=n; i++)
    {
        fin >> deg[i]; cout << deg[i] << " ";
        if(deg[i]==0)   //如果出度为0,则为叶子,leaf[0]为叶子数
            leaf[++leaf[0]] = i;
        else
            for(j=0; j<deg[i]; j++)
            {
                fin >> a >> len; cout << a << " " << len << " ";
                parent[a] = i;  //a结点的父结点为i
                parlen[a] = len;  //a结点到父结点的距离为len
            }           
        cout << endl;
    }
    cout << "输入d:";
    fin >> d; cout << d;

    cout << "\n最小分离集s顶点数为:" << greedy(n, d);
    cout << endl;
    fin.close();
    return 0;
} 

这里写图片描述

彩云 版本:mCloud2.2.0 | 大小:11 MB| 语言:中文 适用固件:Android 2.0及以上 分享日期:2013-12-13 游戏题材:商业 开发商:中国移动通信集团公司 内容介绍 彩云是中国移动旗下的个人网盘产品,面向所有用户提供安全、便捷、高效的个人云存储服务,帮助用户统一存储和管理不同终端的个人信息资产。用户首次注册即可获得16GB的网盘空间,通过官方推出的系列活动可免费领取T级空间。同时,依托运营商的资源优势,为用户提供业内速度最优的上传、下载体验。 【功能特点】 * 账号信息,安全无虞!——彩云向所有用户提供运营商级别的安全防护,除了免费登陆提醒,还有文件加密,全方位保障用户数字资产安全。 * T级空间,瞬间领取!——用户首次注册即可获得16GB的网盘空间,通过官方推出的系列活动可免费升级T级空间。 *精彩资源,短信分享!——直接转存他/她的彩云里,也可给他/她发短信,分享短信彩云无限量,免费发! * 跨端使用,就用彩云!——彩云为手机、个人电脑、平板电脑等提供的客户端覆盖所有操作系统,文件存彩云,手机、电脑,哪里想用点哪里。 * 手机信息,一键备份!——手机端可以实现通讯录、短彩信、手机应用、手机图片、手机视频和日历所有信息的全备份,信息丢失后只需一键恢复,即可找回所有数据。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值