洛谷P4012 深海机器人问题(费用流)
2018-08-20 10:56
357 查看
传送门
图给的好坑……还得倒过来……
用大佬的图做个示范
![](https://images2018.cnblogs.com/blog/1442599/201808/1442599-20180820105105024-1617290522.png)
我们考虑左图吧
把每一个点向下连边,容量$1$,费用为给出的价值(表示一个机器人可以过去取得标本)
再连一条边,容量$inf$,费用$0$(表示剩下的机器人过去无法取得标本)
然后向右连的边也一样
注意连边的顺序
然后源点向所有出发点连边,容量为机器人数,费用$0$,所有目的地向汇点连边,容量为机器人数,费用为$0$
跑个最大费用流
图给的好坑……还得倒过来……
用大佬的图做个示范
![](https://images2018.cnblogs.com/blog/1442599/201808/1442599-20180820105105024-1617290522.png)
我们考虑左图吧
把每一个点向下连边,容量$1$,费用为给出的价值(表示一个机器人可以过去取得标本)
再连一条边,容量$inf$,费用$0$(表示剩下的机器人过去无法取得标本)
然后向右连的边也一样
注意连边的顺序
然后源点向所有出发点连边,容量为机器人数,费用$0$,所有目的地向汇点连边,容量为机器人数,费用为$0$
跑个最大费用流
//minamoto #include<bits/stdc++.h> #define inf 0x3f3f3f3f #define get(i,j) (i-1)*m+j using namespace std; #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++) char buf[1<<21],*p1=buf,*p2=buf; inline int read(){ #define num ch-'0' char ch;bool flag=0;int res; while(!isdigit(ch=getc())) (ch=='-')&&(flag=true); for(res=num;isdigit(ch=getc());res=res*10+num); (flag)&&(res=-res); #undef num return res; } const int N=1005,M=100005; int ver[M],edge[M],head ,Next[M],flow[M],tot=1; int dis ,disf ,vis ,Pre ,last ,n,m,s,t,a,b; queue<int> q; inline void add(int u,int v,int f,int e){ ver[++tot]=v,Next[tot]=head[u],head[u]=tot,flow[tot]=f,edge[tot]=e; ver[++tot]=u,Next[tot]=head[v],head[v]=tot,flow[tot]=0,edge[tot]=-e; } bool spfa(){ memset(dis,0xef,sizeof(dis)); q.push(s),dis[s]=0,disf[s]=inf,Pre[t]=-1; while(!q.empty()){ int u=q.front();q.pop();vis[u]=0; for(int i=head[u];i;i=Next[i]){ int v=ver[i]; if(flow[i]&&dis[v]<dis[u]+edge[i]){ dis[v]=dis[u]+edge[i],Pre[v]=u,last[v]=i; disf[v]=min(disf[u],flow[i]); if(!vis[v]) vis[v]=1,q.push(v); } } } return ~Pre[t]; } int dinic(){ int maxcost=0; while(spfa()){ int u=t;maxcost+=disf[t]*dis[t]; while(u!=s){ flow[last[u]]-=disf[t]; flow[last[u]^1]+=disf[t]; u=Pre[u]; } } return maxcost; } int main(){ a=read(),b=read(),n=read()+1,m=read()+1; s=0,t=n*m+1; for(int i=1;i<=n;++i) for(int j=1;j<m;++j){ int x=read(),hh=get(i,j),tt=hh+1; add(hh,tt,1,x); add(hh,tt,inf,0); } for(int j=1;j<=m;++j) for(int i=1;i<n;++i){ int x=read(),hh=get(i,j),tt=hh+m; add(hh,tt,1,x); add(hh,tt,inf,0); } for(int i=1;i<=a;++i){ int k=read(),x=read()+1,y=read()+1; add(s,get(x,y),k,0); } for(int i=1;i<=b;++i){ int k=read(),x=read()+1,y=read()+1; add(get(x,y),t,k,0); } printf("%d\n",dinic()); return 0; }
相关文章推荐
- 洛谷 P4012 深海机器人问题 【最大费用最大流】
- 洛谷P4012 深海机器人问题(费用流)
- 洛谷 P4016负载平衡问题【费用流】题解+AC代码
- 洛谷P2770:航空路线问题【最大费用最大流】
- 【网络流24题】深海机器人问题(费用流)
- 洛谷P2770 航空路线问题(费用流)
- 【网络流24题】No. 20 深海机器人问题 (费用流)
- 洛谷P4015 运输问题(费用流)
- 【网络流24题】深海机器人问题(费用流)
- 洛谷 P3358 最长k可重区间集问题 【最大费用最大流】
- 洛谷.1251.餐巾计划问题(费用流SPFA)
- 洛谷 P4013 数字梯形问题【最大费用最大流】
- 洛谷P4015 运输问题(费用流)
- [codeVS1917] 深海机器人问题(费用流,拆边)
- 洛谷 P4014 分配问题 【最小费用最大流+最大费用最大流】
- 洛谷 P2770 航空路线问题【最大费用最大流】
- 洛谷P4013 数字梯形问题(费用流)
- 洛谷P1251 餐巾计划问题(费用流)
- 洛谷 P4015 运输问题 【最小费用最大流+最大费用最大流】
- 洛谷 P3356 火星探险问题 【最大费用最大流】