[BZOJ1391][Ceoi2008]order(最小割)
来源:互联网 发布:dnf阿里云搭建 编辑:程序博客网 时间:2024/04/30 21:30
题目描述
传送门
题解
对于每一个工作,s->x,能赚到的钱
对于每一个机器,x->t,买它用的钱
对于每一个工作x用到的机器y,x->y,租的钱
答案即为sigma能赚到的钱-最小割
这其实是最大权闭合子图的一个变形
最大权闭合子图在原图中的边连的是inf,这条inf的边限制了相连的两个点选了一个就不能选另外一个
而这里是租金,即两个点可以同时选,但是必须付出一定的代价
明确的dinic当前弧优化的正确姿势。。
代码
#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>#include<queue>using namespace std;#define N 100005#define M 5000005#define inf 2000000000int n,m,money,k,id,rent,buy,s,t,sum,maxflow;int tot,point[N],nxt[M],v[M],remain[M];int deep[N],last[N],num[N],cur[N];queue <int> q;void addedge(int x,int y,int cap){ ++tot; nxt[tot]=point[x]; point[x]=tot; v[tot]=y; remain[tot]=cap; ++tot; nxt[tot]=point[y]; point[y]=tot; v[tot]=x; remain[tot]=0;}bool bfs(int s,int t){ memset(deep,0x7f,sizeof(deep)); deep[s]=0; for (int i=s;i<=t;++i) cur[i]=point[i]; while (!q.empty()) q.pop(); q.push(s); while (!q.empty()) { int now=q.front();q.pop(); for (int i=point[now];i!=-1;i=nxt[i]) if (deep[v[i]]>inf&&remain[i]) { deep[v[i]]=deep[now]+1; q.push(v[i]); } } return deep[t]<inf;}int dfs(int now,int t,int limit){ if (!limit||now==t) return limit; int flow=0,f; for (int i=cur[now];i!=-1;i=nxt[i]) { cur[now]=i; if (deep[v[i]]==deep[now]+1&&(f=dfs(v[i],t,min(limit,remain[i])))) { flow+=f; limit-=f; remain[i]-=f; remain[i^1]+=f; if (!limit) break; } } return flow;}void dinic(int s,int t){ while (bfs(s,t)) maxflow+=dfs(s,t,inf);}int main(){ tot=-1;memset(point,-1,sizeof(point)); scanf("%d%d",&n,&m); s=1,t=1+n+m+1; for (int i=1;i<=n;++i) { scanf("%d",&money);sum+=money; addedge(s,1+i,money); scanf("%d",&k); while (k--) { scanf("%d%d",&id,&rent); addedge(1+i,1+n+id,rent); } } for (int i=1;i<=m;++i) { scanf("%d",&buy); addedge(1+n+i,t,buy); } dinic(s,t); printf("%d\n",sum-maxflow);}
0 0
- [BZOJ1391][Ceoi2008]order(最小割)
- bzoj1391 [Ceoi2008]order(最小割)
- BZOJ1391 [Ceoi2008]order 最小割
- 【bzoj1391】【Ceoi2008】【Order】【最小割】
- bzoj 1391: [Ceoi2008]order(最小割)
- BZOJ1391 [Ceoi2008]order
- BZOJ1391: [Ceoi2008]order
- 【CEOI2008】bzoj1391 order
- 【bzoj1391】[Ceoi2008]order
- bzoj1391 [Ceoi2008]order
- 【BZOJ 1391】[Ceoi2008]order 最小割
- [CEOI2008] BZOJ 1391 order-最小割
- BZOJ1391【最小割】
- 1391: [Ceoi2008]order 最大权闭合图 最小割
- BZOJ1391: [Ceoi2008]order 最大权闭合子图
- bzoj1391 [Ceoi2008]order 网络流——最大权闭合子图
- 【bzoj1391】order
- bzoj1570 [CEOI2008]order
- POJ 1836 Alignment DP LIS
- hibernate知识点总结
- Linux下C++编译出错原因解析
- 九宫格C
- flask蓝图的使用
- [BZOJ1391][Ceoi2008]order(最小割)
- BZOJ 1084: [SCOI2005]最大子矩阵 DP
- 蓝桥杯 算法训练 输出米字形
- Ubuntu 16.04 LTS与windows双系统时间同步解决方法
- Algorithm Review 1 基础排序算法
- 使用JPA实现乐观锁
- flask部署-Ubuntu下使用nginx+uwsgi+supervisor部署flask应用
- NUCLEO-F767ZI以太网初探
- 蓝桥杯 基础练习 数的读法