洛谷 P2762 太空飞行计划问题

本文介绍了一种解决太空飞行实验选择问题的方法,通过构建特定的算法来最大化飞行任务的净收益。该算法考虑了不同实验所需的仪器配置成本及预期收入。

题目描述

W 教授正在为国家航天中心计划一系列的太空飞行。每次太空飞行可进行一系列商业性实验而获取利润。现已确定了一个可供选择的实验集合E={E1,E2,…,Em},和进行这些实验需要使用的全部仪器的集合I={I1,I2,…In}。实验Ej需要用到的仪器是I的子集RjÍI。配置仪器Ik的费用为ck美元。实验Ej的赞助商已同意为该实验结果支付pj美元。W教授的任务是找出一个有效算法,确定在一次太空飞行中要进行哪些实验并因此而配置哪些仪器才能使太空飞行的净收益最大。这里净收益是指进行实验所获得的全部收入与配置仪器的全部费用的差额。

对于给定的实验和仪器配置情况,编程找出净收益最大的试验计划。

输入输出格式

输入格式:

 

第1行有2 个正整数m和n。m是实验数,n是仪器数。接下来的m 行,每行是一个实验的有关数据。第一个数赞助商同意支付该实验的费用;接着是该实验需要用到的若干仪器的编号。最后一行的n个数是配置每个仪器的费用。

 

输出格式:

 

第1 行是实验编号;第2行是仪器编号;最后一行是净收益。

 

输入输出样例

输入样例#1: 复制
2 3
10 1 2
25 2 3
5 6 7
输出样例#1: 复制
1 2
1 2 3
17

说明

感谢@zhouyonglong 提供spj

n,m<=50

这道题数据是在windows生成的,输入数据中所有的换行都是'\r\n'而不是'\n'
读入某实验需要用到的仪器编号的时候,可以这么读入。(感谢@zhouyonglong的提供)

char tools[10000];
memset(tools,0,sizeof tools);
cin.getline(tools,10000);
int ulen=0,tool;
while (sscanf(tools+ulen,"%d",&tool)==1)//之前已经用scanf读完了赞助商同意支付该实验的费用
{//tool是该实验所需仪器的其中一个      
    //这一行,你可以将读进来的编号进行储存、处理,如连边。
    if (tool==0) 
        ulen++;
    else {
        while (tool) {
            tool/=10;
            ulen++;
        }
    }
    ulen++;
}

 

思路:输入错误,网络刘高一下就出来了,建图也很简单。

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 10000
using namespace std;
queue<int>que;
int n,m,tot=1,ans,scr,decc,sum;
int to[MAXN],from[MAXN],net[MAXN],cap[MAXN],cur[MAXN],lev[MAXN];
void add(int u,int v,int w){
    to[++tot]=v;net[tot]=from[u];cap[tot]=w;from[u]=tot;
    to[++tot]=u;net[tot]=from[v];cap[tot]=0;from[v]=tot;
}
bool bfs(){
    for(int i=scr;i<=decc;i++){
        lev[i]=-1;
        cur[i]=from[i];
    }
    while(!que.empty())    que.pop();
    que.push(scr);
    lev[scr]=0;
    while(!que.empty()){
        int now=que.front();
        que.pop();
        for(int i=from[now];i!=-1;i=net[i])
            if(lev[to[i]]==-1&&cap[i]>0){
                lev[to[i]]=lev[now]+1;
                que.push(to[i]);
                if(to[i]==decc)    return true;
            }
    }
    return false;
}
int dinic(int now,int flow){
    if(now==decc)    return flow;
    int rest=0,detal;
    for(int & i=cur[now];i!=-1;i=net[i])
        if(lev[to[i]]==lev[now]+1&&cap[i]>0){
            detal=dinic(to[i],min(flow-rest,cap[i]));
            if(detal){
                rest+=detal;
                cap[i]-=detal;
                cap[i^1]+=detal;
                if(rest==flow)    break;
            }
        }
    if(rest!=flow)    lev[now]=-1;
    return rest;
}
int main(){
    memset(from,-1,sizeof(from));
    cin>>m>>n;
    scr=0;decc=m+n+1;
    for(int i=1;i<=m;i++){
        int w;string s;
        cin>>w;sum+=w;
        add(scr,i,w);
        /*getline(cin,s);
        for(int j=0;j<s.length();j++){
            if(s[j]==' ')    continue;
            else{
                int v=s[j]-'0';
                add(i,v+m,0x7fffffff);
            }
        }*/
        while(getchar()!='\n') {  
            int v;scanf("%d",&v);  
            add(i,v+m,0x7fffffff);  
        } 
    }
    for(int i=1;i<=n;i++){
        int w;cin>>w;
        add(i+m,decc,w);
    }
    while(bfs())
        ans+=dinic(scr,0x7fffffff);
    for(int i=1;i<=m;i++)
        if(lev[i]!=-1)    cout<<i<<" ";
    cout<<endl;
    for(int i=1;i<=n;i++)
        if(lev[i+m]!=-1)    cout<<i<<" ";
    cout<<endl;
    cout<<sum-ans;
}

 

转载于:https://www.cnblogs.com/cangT-Tlan/p/8537282.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值