博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[2018湖南省队集训] 6.24 T1 marshland
阅读量:5015 次
发布时间:2019-06-12

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

 

    一开始感觉像一个类似二分图的最小割,于是成功跑偏2333333

    很容易发现一个关键性质,'L'的两个角落在的偶数格 的行(或者列)的奇偶性一定不同。。。。

    于是我们再把偶数格按照行(或者列)的奇偶性再细分成 两类,可以发现只有一个奇数格向旁边的两类偶数格都有空挡的话,才能放下一个L。

    所以我们把放L看成网络中的一条流量,要经过三种点,于是对于奇数格拆点限流然后四列点直接跑最大费用最大流就行了。。。。

   

    因为不用把m个L都放完,所以增广到 dis<0 的时候跳出就好啦。。。。

 

#include
#include
#include
#include
#define ll long longusing namespace std;#define pb push_backconst int N=10005;vector
g[N];struct lines{ int from,to,flow,cap,cost;}l[N*73];int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0},X,Y;int S,T,t=-1,d[N],p[N],a[N],n,m,ans;int val[55][55],id[55][55],cnt,k;bool iq[N],ban[55][55];inline void add(int from,int to,int cap,int cost){ l[++t]=(lines){from,to,0,cap,cost},g[from].pb(t); l[++t]=(lines){to,from,0,0,-cost},g[to].pb(t);}inline bool SPFA(){ memset(d,-0x3f,sizeof(d)),d[S]=0,p[S]=0; queue
q; q.push(S),a[S]=1<<30; int x,pre; lines e; while(!q.empty()){ x=q.front(),q.pop(); for(int i=g[x].size()-1;i>=0;i--){ e=l[g[x][i]]; if(e.flow
d[e.to]){ d[e.to]=d[x]+e.cost; a[e.to]=min(a[x],e.cap-e.flow); p[e.to]=g[x][i]; if(!iq[e.to]) iq[e.to]=1,q.push(e.to); } } iq[x]=0; } if(d[T]<0) return 0; if(a[T]>=m){ ans-=d[T]*m; return 0;} ans-=d[T]*a[T],m-=a[T]; for(x=T;x!=S;x=l[pre].from){ pre=p[x],l[pre].flow+=a[T]; l[pre^1].flow-=a[T]; } return 1;} inline void solve(){ S=0,T=cnt+1; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(!ban[i][j]) if(i+j&1) add(id[i][j],id[i][j]+cnt,1,val[i][j]); else if(i&1){ add(S,id[i][j],1,0); for(int u=0;u<4;u++){ X=i+dx[u],Y=j+dy[u]; if(id[X][Y]) add(id[i][j],id[X][Y],1,0); } } else{ add(id[i][j],T,1,0); for(int u=0;u<4;u++){ X=i+dx[u],Y=j+dy[u]; if(id[X][Y]) add(id[X][Y]+cnt,id[i][j],1,0); } } while(SPFA());}int main(){// freopen("marshland.in","r",stdin);// freopen("marshland.out","w",stdout); scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ scanf("%d",&val[i][j]); id[i][j]=++cnt,ans+=val[i][j]; } while(k--) scanf("%d%d",&X,&Y),ban[X][Y]=1; solve(); printf("%d\n",ans); return 0;}

  

转载于:https://www.cnblogs.com/JYYHH/p/9245543.html

你可能感兴趣的文章
The Ctrl & CapsLock `problem'
查看>>
MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作
查看>>
linux故障判断
查看>>
Leetcode 23. Merge k Sorted Lists(python)
查看>>
Java进阶知识点6:并发容器背后的设计理念 - 锁分段、写时复制和弱一致性
查看>>
Makefile ===> Makefile 快速学习
查看>>
face detection[HR]
查看>>
java性能调优工具
查看>>
C# 其他的Url 文件的路径转化为二进制流
查看>>
cmake使用
查看>>
ios7上隐藏status bar
查看>>
构造方法和全局变量的关系
查看>>
python3基础05(有关日期的使用1)
查看>>
ArrayList的使用方法
查看>>
面向对象高级
查看>>
Bitwise And Queries
查看>>
打印Ibatis最终的SQL语句
查看>>
HBase之八--(3):Hbase 布隆过滤器BloomFilter介绍
查看>>
oracle连接问题ORA-00604,ORA-12705
查看>>
NOI 2019 退役记
查看>>