poj 1149 -- PIGS

本文通过网络流算法解决养猪场如何最大化卖出猪的问题。利用Dinic算法实现最优销售方案,详细介绍了建图过程及代码实现。

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

PIGS
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 15747 Accepted: 7034

Description

Mirko works on a pig farm that consists of M locked pig-houses and Mirko can't unlock any pighouse because he doesn't have the keys. Customers come to the farm one after another. Each of them has keys to some pig-houses and wants to buy a certain number of pigs.
All data concerning customers planning to visit the farm on that particular day are available to Mirko early in the morning so that he can make a sales-plan in order to maximize the number of pigs sold.
More precisely, the procedure is as following: the customer arrives, opens all pig-houses to which he has the key, Mirko sells a certain number of pigs from all the unlocked pig-houses to him, and, if Mirko wants, he can redistribute the remaining pigs across the unlocked pig-houses.
An unlimited number of pigs can be placed in every pig-house.
Write a program that will find the maximum number of pigs that he can sell on that day.

Input

The first line of input contains two integers M and N, 1 <= M <= 1000, 1 <= N <= 100, number of pighouses and number of customers. Pig houses are numbered from 1 to M and customers are numbered from 1 to N.
The next line contains M integeres, for each pig-house initial number of pigs. The number of pigs in each pig-house is greater or equal to 0 and less or equal to 1000.
The next N lines contains records about the customers in the following form ( record about the i-th customer is written in the (i+2)-th line):
A K1 K2 ... KA B It means that this customer has key to the pig-houses marked with the numbers K1, K2, ..., KA (sorted nondecreasingly ) and that he wants to buy B pigs. Numbers A and B can be equal to 0.

Output

The first and only line of the output should contain the number of sold pigs.

Sample Input

3 3
3 1 10
2 1 2 2
2 1 3 3
1 2 6

Sample Output

7

题意:有一养猪场,有m个猪圈,给出每个猪圈中猪的数量,来了n个买主,每个买主手中有若干猪圈的钥匙,且给出每个买主想要买多少猪。问,最多能卖出多少头猪。

思路:网络流最大流问题。第二个最大流的题目,建图比较麻烦。下面说说我的建图方式。

  1. 我们将所有买主当成结点。那么除了买主外,还需两个点,一个源点一个汇点。我称之为supers,supert.
  2. 将源点与每个猪圈的第一个买主建边,如有重复的可并,实现的时候我是用flag[]数组标记钥匙是否第一次出现,如果是则可建边,否则看 step 3.
  3. 如果不是第一次出现,说明在这个买主之前有买主买猪。这时,在这两个买主之间建边,权值(也就是容量)为INF。实现时是用nodes[]数组记录前一个买主。
  4. 将每个买主连向汇点。容量为次买主要买的猪数。

  我的建图方式就是这样。。建完图后用Dinic 求解。

  1 /*======================================================================
  2  *           Author :   kevin
  3  *         Filename :   PIGS.cpp
  4  *       Creat time :   2014-07-20 15:11
  5  *      Description :
  6 ========================================================================*/
  7 #include <iostream>
  8 #include <algorithm>
  9 #include <cstdio>
 10 #include <cstring>
 11 #include <queue>
 12 #include <cmath>
 13 #define clr(a,b) memset(a,b,sizeof(a))
 14 #define MaxM 1005
 15 #define MaxN 105
 16 #define INF 0x7f7f7f7f
 17 using namespace std;
 18 struct Edge{
 19     int from,to,cap,flow;
 20 };
 21 vector<Edge> edges;
 22 vector<int>G[MaxN];
 23 bool vis[MaxN];
 24 int d[MaxN],cur[MaxN],supers,supert;
 25 bool BFS()
 26 {
 27     clr(vis,0);
 28     queue<int>Q;
 29     Q.push(supers);
 30     d[supers] = 0;
 31     vis[supers] = 1;
 32     while(!Q.empty()){
 33         int x = Q.front(); Q.pop();
 34         int len = G[x].size();
 35         for(int i = 0; i < len; i++){
 36             Edge& e = edges[G[x][i]];
 37             if(!vis[e.to] && e.cap > e.flow){
 38                 vis[e.to] = 1;
 39                 d[e.to] = d[x]+1;
 40                 Q.push(e.to);
 41             }
 42         }
 43     }
 44     return vis[supert];
 45 }
 46 int DFS(int x,int a)
 47 {
 48     if(x == supert || a == 0) return a;
 49     int flow = 0,f;
 50     int len = G[x].size();
 51     for(int& i = cur[x]; i < len; i++){
 52         Edge& e = edges[G[x][i]];
 53         if(d[x] + 1 == d[e.to] && (f = DFS(e.to,min(a,e.cap-e.flow))) > 0){
 54             e.flow += f;
 55             edges[G[x][i]^1].flow -= f;
 56             flow += f;
 57             a -= f;
 58             if(!a) break;
 59         }
 60     }
 61     return flow;
 62 }
 63 void AddEdge(int from,int to,int cap)
 64 {
 65     edges.push_back((Edge){from,to,cap,0});
 66     edges.push_back((Edge){to,from,0,0});
 67     int m = edges.size();
 68     G[from].push_back(m-2);
 69     G[to].push_back(m-1);
 70 }
 71 int Dinic(int s,int t)
 72 {
 73     int flow = 0;
 74     while(BFS()){
 75         clr(cur,0);
 76         flow += DFS(s,INF);
 77     }
 78     return flow;
 79 }
 80 int main(int argc,char *argv[])
 81 {
 82     int n,m,keys,k;
 83     int pighome[MaxM],  //猪圈中猪的数量
 84         nodes[MaxM],    //前一个买主的信息
 85         flag[MaxM];     //标记是否是买猪第一人
 86     while(scanf("%d%d",&n,&m)!=EOF){
 87         clr(pighome,0);
 88         clr(nodes,0);
 89         clr(flag,0);
 90         supers = 0;
 91         supert = m+1;
 92         for(int i = 1; i <= n; i++)
 93             scanf("%d",&pighome[i]);
 94         for(int i = 1; i <= m; i++){
 95             int sum = 0;
 96             scanf("%d",&keys);  //钥匙的数量
 97             for(int j = 0; j < keys; j++){
 98                 scanf("%d",&k);
 99                 if(!flag[k]){
100                     sum += pighome[k];  //合并重边
101                     flag[k] = 1;
102                 }
103                 else{
104                     if(nodes[k]){
105                         AddEdge(nodes[k],i,INF); //建买主之间的边
106                     }
107                 }
108                 nodes[k] = i;
109             }
110             AddEdge(supers,i,sum);  //添加合并后的边
111             int buy;
112             scanf("%d",&buy);
113             AddEdge(i,supert,buy);  //建立买主到汇点的边
114         }
115         int ans = Dinic(supers,supert);
116         printf("%d\n",ans);
117         edges.clear();
118         for(int i = 0; i < MaxN; i++)
119             G[i].clear();
120     }
121     return 0;
122 }
View Code

 


  

转载于:https://www.cnblogs.com/ubuntu-kevin/p/3856340.html

内容概要:本文围绕直流微电网中带有恒功率负载(CPL)的DC/DC升压转换器的稳定控制问题展开研究,提出了一种复合预设性能控制策略。首先,通过精确反馈线性化技术将非线性不确定的DC转换器系统转化为Brunovsky标准型,然后利用非线性扰动观测器评估负载功率的动态变化和输出电压的调节精度。基于反步设计方法,设计了具有预设性能的复合非线性控制器,确保输出电压跟踪误差始终在预定义误差范围内。文章还对比了多种DC/DC转换器控制技术如脉冲调整技术、反馈线性化、滑模控制(SMC)、主动阻尼法和基于无源性的控制,并分析了它们的优缺点。最后,通过数值仿真验证了所提控制器的有效性和优越性。 适合人群:从事电力电子、自动控制领域研究的学者和工程师,以及对先进控制算法感兴趣的研究生及以上学历人员。 使用场景及目标:①适用于需要精确控制输出电压并处理恒功率负载的应用场景;②旨在实现快速稳定的电压跟踪,同时保证系统的鲁棒性和抗干扰能力;③为DC微电网中的功率转换系统提供兼顾瞬态性能和稳态精度的解决方案。 其他说明:文中不仅提供了详细的理论推导和算法实现,还通过Python代码演示了控制策略的具体实现过程,便于读者理解和实践。此外,文章还讨论了不同控制方法的特点和适用范围,为实际工程项目提供了有价值的参考。
内容概要:该论文介绍了一种名为偏振敏感强度衍射断层扫描(PS-IDT)的新型无参考三维偏振敏感计算成像技术。PS-IDT通过多角度圆偏振光照射样品,利用矢量多层光束传播模型(MSBP)和梯度下降算法迭代重建样品的三维各向异性分布。该技术无需干涉参考光或机械扫描,能够处理多重散射样品,并通过强度测量实现3D成像。文中展示了对马铃薯淀粉颗粒和缓步类动物等样品的成功成像实验,并提供了Python代码实现,包括系统初始化、前向传播、多层传播、重建算法以及数字体模验证等模块。 适用人群:具备一定光学成像和编程基础的研究人员,尤其是从事生物医学成像、材料科学成像领域的科研工作者。 使用场景及目标:①研究复杂散射样品(如生物组织、复合材料)的三维各向异性结构;②开发新型偏振敏感成像系统,提高成像分辨率和对比度;③验证和优化计算成像算法,应用于实际样品的高精度成像。 其他说明:PS-IDT技术相比传统偏振成像方法具有明显优势,如无需干涉装置、无需机械扫描、可处理多重散射等。然而,该技术也面临计算复杂度高、需要多角度数据采集等挑战。文中还提出了改进方向,如采用更高数值孔径(NA)物镜、引入深度学习超分辨率技术等,以进一步提升成像质量和效率。此外,文中提供的Python代码框架为研究人员提供了实用的工具,便于理解和应用该技术。
内容概要:本文详细介绍了机械运转振动数据分析与处理的方法,重点研究了转子试验台、齿轮箱和滚动轴承的振动数据。文章涵盖了频谱分析、时域和频域特征计算,以及常见故障(如不平衡、不对中、齿轮啮合故障、轴承内外圈故障)的诊断方法。文中还探讨了采样频率和采样点的设置原则、全周期采样机制,并扩展了多种信号分析方法(如频谱细化、希尔伯特包络谱分析、经验模态分解、小波变换)和人工智能方法(如卷积神经网络)的应用。通过详细的代码实现,展示了从数据加载与预处理到基于CNN的故障诊断的完整流程。 适合人群:具备一定机械工程和编程基础,从事机械设备维护、故障诊断的研究人员和技术人员。 使用场景及目标:①通过频谱分析、时域和频域特征计算,识别机械设备的常见故障;②利用包络分析、小波变换等高级信号处理方法,检测早期故障;③结合深度学习方法,实现自动化故障分类和诊断。 阅读建议:本文不仅提供了理论分析,还包含了大量可运行的Python代码示例。读者应在实践中结合这些代码,进行数据处理和模型训练,以便更好地理解和掌握各种故障诊断方法。此外,建议读者根据具体的设备和应用场景,灵活选择和组合不同的分析方法,以提高故障诊断的准确性和可靠性。
内容概要:本文详细描述了一个基于论文“具有批处理到达的服务器群的优先级排队”的服务器群模拟系统的实现。系统采用离散事件仿真方法,通过Python代码实现,涵盖作业到达、优先级队列管理、作业完成处理、合并器工作机制以及响应时间计算等功能。模拟系统支持随机模式和轨迹驱动模式,能够生成详细的运行日志和性能统计,如平均响应时间、服务器利用率等。此外,还实现了设计问题优化,通过多次重复运行和置信区间分析来确定最优的优先级阈值h,以最小化平均响应时间。最后,系统能够按照要求的格式生成输出文件,包括平均响应时间文件、子作业离开时间文件和作业完成时间文件。 适合人群:计算机科学及相关领域的研究人员、研究生以及从事分布式系统、排队论研究的专业人士。 使用场景及目标:①研究服务器群系统中不同参数(如优先级阈值h)对系统性能的影响;②分析批处理到达模式下的作业调度策略;③评估不同配置下的系统响应时间和服务器利用率;④提供一个可扩展的平台,用于进一步的研究和开发。 其他说明:本文不仅提供了完整的代码实现,还深入探讨了关键机制的设计原理和实现细节,如优先级队列处理、合并器逻辑、事件处理流程等。通过阅读本文,读者不仅可以理解服务器群模拟系统的运作原理,还能掌握如何应用离散事件仿真方法解决实际问题。此外,本文还强调了统计可靠性和性能优化的重要性,为后续研究提供了坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值