博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu3879 网络流(经典最大获利问题)
阅读量:6872 次
发布时间:2019-06-26

本文共 1747 字,大约阅读时间需要 5 分钟。

这题建图自己想了半天搞不懂,然后看了一下别人的建图。。。一脸茫然。。

最后去看了下胡波涛的《最小割模型在信息学竞赛的应用》里面详细的讲解了将最大获利问题转换为最小割模型的过程。

建图:

源点与人连边,容量为获利。站点与汇点连边,容量为耗资。然后是相应的人与其需求的站点连边,容量为无穷。

这样建图就完成了,然后就是找最小割,即割边上的值便为不能获取的利润值,用总值减去得出最大利润。

 

#include
#include
#include
#define MAXN 60000 //点的个数#define INF 1e8#define min(a,b) (a
b?a:b)using namespace std;struct edge{ int u,v,w,next;}E[400050]; //边的个数 记得乘2int head[MAXN],ecnt;int gap[MAXN],cur[MAXN],pre[MAXN],dis[MAXN];int l,r,mid;int N,M,scr,sink,vn,num;void Insert(int u,int v,int w){ E[ecnt].u=u; E[ecnt].v=v; E[ecnt].w=w; E[ecnt].next=head[u]; head[u]=ecnt++; E[ecnt].u=v; E[ecnt].v=u; E[ecnt].w=0; E[ecnt].next=head[v]; head[v]=ecnt++;}int Sap(int s,int t,int n)//核心代码(模版){ int ans=0,aug=INF;//aug表示增广路的流量 int i,v,u=pre[s]=s; for(i=0;i<=n;i++) { cur[i]=head[i]; dis[i]=gap[i]=0; } gap[s]=n; bool flag; while(dis[s]
0&&dis[u]==dis[v]+1) { flag=true;//找到容许边 aug=min(aug,E[j].w); pre[v]=u; u=v; if(u==t) { ans+=aug; while(u!=s) { u=pre[u]; E[cur[u]].w-=aug; E[cur[u]^1].w+=aug;//注意 } aug=INF; } break;//找到一条就退出 } } if(flag) continue; int mindis=n; for(i=head[u];i!=-1;i=E[i].next) { v=E[i].v; if(E[i].w>0&&dis[v]

 

转载于:https://www.cnblogs.com/amourjun/archive/2013/06/03/5134142.html

你可能感兴趣的文章
SQL 标量函数-----日期函数 day() 、month()、year()
查看>>
替换空格
查看>>
《Programming in Lua 3》读书笔记(二十二)
查看>>
ubuntu16.04中将python3设置为默认
查看>>
【使用Java原生API编写发送HTTP_POST请求的工具类】
查看>>
Leetcode2 Add Two Numbers
查看>>
R语言线性混合效应模型实战案例
查看>>
python27+selenium3自动化登录测试
查看>>
Effective C++ 之 0 导读(Introduction)
查看>>
Io Language Demo code first day
查看>>
C#动态调用webService出现 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系。...
查看>>
新闻发布项目——后台JSP界面adminManage/addNews.jsp
查看>>
常用的字符串加密解密工具类
查看>>
web渐进式应用PWA
查看>>
Eclipse快捷键大全(一)
查看>>
mybatis3温故
查看>>
Android 文件管理方法
查看>>
白钰铭的第六次作业
查看>>
linkin大话数据结构--List
查看>>
idea中查看java类继承图
查看>>