poj 1149 pigs(最大流)

本文介绍了一个算法,用于解决在一个农场环境中,迈克如何通过重新分配猪仔来最大化卖出数量的问题。该算法将每个顾客视为一个点,并通过源点、汇点以及猪舍之间的连接来构建图,从而利用最大流原理找到最优解决方案。

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

题目大意:迈克在农场工作,农场有 m 个猪舍,每个猪舍有若干只猪,但是迈克不能打开任何一间猪舍。有 n 个顾客前来购买,每个顾客有最大的购买数量,每个顾客可以购买某些猪舍的猪,且顾客可以打开这些猪舍,从中挑选猪仔。重要的是,迈克可以在打开的这些猪舍中重新分配猪仔。由于知道每个猪舍的猪仔数目和顾客的购买情况,求迈克可以卖出的最大数目的猪仔。

解题思路:将每个顾客看成一个点,加上源点、汇点。将每个猪舍的第一位客人与源点相连,容量为猪舍中猪仔的数目,将每个猪圈的前以为顾客与后一位顾客相连,容量为INF,将每位顾客与汇点相连,容量为顾客的最大购买量。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
using namespace std;
int m,n,f,tag[1001];
queue<int> Q;
struct edge{
    int from;
    int to;
    int flow;
    int cap;
};
vector<edge>e;
vector<int>adj[1200];

void init(){
    f = 0;
    for(int i=0;i<=n+m+1;i++)
        adj[i].clear();
}

void addedge(int from,int to,int flow,int cap){
    e.push_back((edge){from,to,flow,cap});
    e.push_back((edge){to,from,flow,0});
    int t = e.size();
    adj[from].push_back(t - 2);
    adj[to].push_back(t - 1);
}

void solve(){
    int i,j,a[1200],p[1200];
    for( ; ; ){
        memset(a,0,sizeof(a));
        a[0] = 10000000;
        while(!Q.empty())
            Q.pop();
        Q.push(0);
        while(!Q.empty()){
            int x = Q.front();
            Q.pop();
            for(i=0;i<adj[x].size();i++){
                int t = adj[x][i] ;
                int v = e[t].to;
                if(!a[v] && e[t].flow < e[t].cap){
                    a[v] = a[x] < e[t].cap - e[t].flow ? a[x] : e[t].cap - e[t].flow;
                    Q.push(v);
                    p[v] = t ;
                }
            }
        }
        
        if(!a[n+1])
            break;
        int u = n+1;
        for( ; u != 0; u = e[p[u]].from){
            e[p[u]].flow += a[n+1] ;
            e[p[u] ^ 1].flow -= a[n+1] ;
        }
        f += a[n+1] ;
    }
}

int main(){
    int i,j,a,b;
    int p[1001],c[1001],x;
    while(scanf("%d%d",&m,&n) == 2){
        init();
        for(i=1;i<=m;i++)
            cin >> c[i] ;
        memset(tag,0,sizeof(tag));
        for(i=1;i<=n;i++){
            cin >> a ;
            for(j=1;j<=a;j++){
                cin >> x ;
                if(!tag[x]){
                    addedge(0,i,0,c[x]);
                    tag[x] = i ;
                }
                else
                    addedge(tag[x],i,0,100000);
            }
            cin >> b ;
            addedge(i,n+1,0,b);
        } 
        
        solve();
        
        printf("%d\n",f);
    }
    return 0;
}

转载于:https://www.cnblogs.com/jxgapyw/p/4860547.html

内容概要:本文详细探讨了基于MATLAB/SIMULINK的多载波无线通信系统仿真及性能分析,重点研究了以OFDM为代表的多载波技术。文章首先介绍了OFDM的基本原理和系统组成,随后通过仿真平台分析了不同调制方式的抗干扰性能、信道估计算法对系统性能的影响以及同步技术的实现与分析。文中提供了详细的MATLAB代码实现,涵盖OFDM系统的基本仿真、信道估计算法比较、同步算法实现和不同调制方式的性能比较。此外,还讨论了信道特征、OFDM关键技术、信道估计、同步技术和系统级仿真架构,并提出了未来的改进方向,如深度学习增强、混合波形设计和硬件加速方案。; 适合人群:具备无线通信基础知识,尤其是对OFDM技术有一定了解的研究人员和技术人员;从事无线通信系统设计与开发的工程师;高校通信工程专业的高年级本科生和研究生。; 使用场景及目标:①理解OFDM系统的工作原理及其在多径信道环境下的性能表现;②掌握MATLAB/SIMULINK在无线通信系统仿真中的应用;③评估不同调制方式、信道估计算法和同步算法的优劣;④为实际OFDM系统的设计和优化提供理论依据和技术支持。; 其他说明:本文不仅提供了详细的理论分析,还附带了大量的MATLAB代码示例,便于读者动手实践。建议读者在学习过程中结合代码进行调试和实验,以加深对OFDM技术的理解。此外,文中还涉及了一些最新的研究方向和技术趋势,如AI增强和毫米波通信,为读者提供了更广阔的视野。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值