【网络流】- LA5905-Pool construction
来源:互联网 发布:数据字典表示什么 编辑:程序博客网 时间:2024/05/17 08:52
链接:我是链接啊啊啊哈哈哈
题意:
泳池最外一圈必须全搞成#
对其他的点有三种处理方式
1.放着不动
对其他的点有三种处理方式
1.放着不动
2.花费 d 把 # 变成 .
3.花费 f 把 . 变成 #
最后 # 和 . 不能相邻,要在他们之间修围墙
围墙单位边造价是b
问最小总花费
最后 # 和 . 不能相邻,要在他们之间修围墙
围墙单位边造价是b
问最小总花费
图最后变成什么样都行,只要能让花费最小
思路:
一看是修围墙,那就网络流呗,最小割啥的,好吧,不会建图
网络流难就难在建图。想了一阵没想出来
看答案去了。
这样建图
1、设定源点S,和汇点T.
2、把最外围的洞全部变为草,然后对于最外围的每个草建立S到该点容量为无穷大的边
3、对于其他的草,建立S到该点容量为d的边,对于洞建立该点到汇点容量为f的边
4、对于图中的每个点与它周围建立容量为b的双向边。
代码:
#include<cstdio>#include<cstring>#include<iostream>using namespace std;const int maxn = 3000;const int maxm = 60000;const int INF = 0x7FFFFFF;#define mem(name,value) memset((name),(value),sizeof(name))struct Side{ int to,next,c;}side[maxm];int top,node[maxn];void add_side(int u,int v,int c,int rc){ //cout<<u<<" --> "<<v<<" need "<<c<<endl; side[top]=(Side){v,node[u],c};node[u]=top++; side[top]=(Side){u,node[v],rc};node[v]=top++;}int start,end,cnt,dis[maxn],gap[maxn];int get_flow(int u,int flow){ //printf("%d %d\n",u,flow); if(u==end)return flow; int ans=0; for(int i=node[u];i!=-1;i=side[i].next){ int v=side[i].to,c=side[i].c; if(dis[u]>dis[v]&&c){ int f=get_flow(v,min(flow-ans,c)); ans+=f; side[i].c-=f; side[i^1].c+=f; if(ans==flow)return ans; } } if(!(--gap[dis[u]]))dis[start]=cnt+2; gap[++dis[u]]++; return ans;}char grid[55][55];int fans,f,d,b,cnn;int n,m;int getid(int x,int y){ return x*n+y+1;}void deal_ini(){ //cout<<"****"<<endl; int i,j; int id; //cout<<"n="<<n<<endl; for(i=0;i<n;i++) { //cout<<"****"<<endl; if(grid[0][i] == '.') fans += f; id = getid(0,i); //cout<<0<<" --> "<<id<<" need "<<INF<<endl; add_side(0,id,INF,0); if(grid[m-1][i] == '.') fans += f; id = getid(m-1,i); add_side(0,id,INF,0); } for(i=1;i<m-1;i++) { if(grid[i][0] == '.') fans += f; id = getid(i,0); add_side(0,id,INF,0); if(grid[i][n-1] == '.') fans += f; id = getid(i,n-1); add_side(0,id,INF,0); }}void makemap(){ int i,j,id; for(i=1;i<m-1;i++) { for(j=1;j<n-1;j++) { id = getid(i,j); if(grid[i][j] == '#') add_side(0,id,d,0); else add_side(id,m*n+1,f,0); } } for(i=1;i<m;i++) { for(j=0;j<n;j++) { int id1 = getid(i,j); int id2 = getid(i-1,j); add_side(id1,id2,b,0); add_side(id2,id1,b,0); } } for(j=1;j<n;j++) { for(i=0;i<m;i++) { int id1 = getid(i,j); int id2 = getid(i,j-1); add_side(id1,id2,b,0); add_side(id2,id1,b,0); } }}int main(){ //freopen("input.txt","r",stdin); int T; scanf("%d",&T); while(T--) { fans=0; cnn=1; memset(grid,0,sizeof(grid)); scanf("%d%d",&n,&m); scanf("%d%d%d",&d,&f,&b); for(int i=0;i<m;i++) scanf("%s",grid[i]); /*for(int i=0;i<m;i++) cout<<grid[i]<<endl;*/ top=0; mem(node,-1); mem(gap,0); mem(dis,0); deal_ini(); makemap(); int ans=0; start=0; end=n*m+1; cnt=n*m+2; gap[0]=cnt; while(dis[start]<cnt)ans+=get_flow(start,INF); printf("%d\n",ans+fans); } return 0;}
0 0
- 【网络流】- LA5905-Pool construction
- UVA 1515 Pool construction(网络流)
- LA 5905 Pool construction 最大流
- uva 1515 Pool construction(最大流)
- [最小割最大流]UVa1515 - Pool construction
- Uva-1515-Pool construction
- 1515 - Pool construction
- UVa 1515 Pool construction
- UVA 1515 Pool construction
- UVA 1515Pool construction
- UVA 1515 Pool construction
- 1515 - Pool construction(最大流最小割模型)
- 最小割 UVA 1515 Pool construction
- UVA 1515 Pool construction [最小割]
- UVA 1515 Pool construction(最小割)
- uva 1515 Pool construction(最小割)
- SGU_176 Flow construction 有上下界的网络流
- SGU 176 Flow construction-上下界网络流
- 魔方机器人之下位机编程------下位机完整程序
- SQL Server 聚集索引和非聚集索引的区别分析 发布日(未知日期)
- javascript的内置对象
- WebRTC学习笔记
- POJ 3481 Double Queue 堆修改标记
- 【网络流】- LA5905-Pool construction
- (转载)关于android应用程序的入口Activity
- 大话项目管理工具之Confluence篇
- 安装hadoop1.2.1集群环境
- HDU -- 4888 Redraw Beautiful Drawings(最大流,判断最大流唯一性)
- KVM虚拟机代码揭秘——设备IO虚拟化
- linux /etc/fstab详解
- Windows7安装OpenSSH
- [leetcode] Divide Two Integers