BZOJ4554 [Tjoi2016&Heoi2016]游戏
2016-05-12 19:37
369 查看
假如没有硬石头的话就是对于每个能放炸弹的点(x,y)第x行连第y列,然后跑二分图最大匹配,有硬石头的话把一个炸弹横向和纵向能炸到的地方算一行和一列,然后和没有硬石头一样
#include<iostream> #include<cstdlib> #include<cstdio> #include<cstring> #include<cmath> #include<ctime> #include<algorithm> #include<iomanip> #include<vector> #include<stack> #include<queue> #include<map> #include<set> #include<bitset> using namespace std; #define MAXN 2510 #define MAXM 5000010 #define ll long long #define INF 1000000000 #define MOD 1000000007 #define eps 1e-8 struct vec{ int to; int fro; int v; }; vec mp[MAXM]; int tai[MAXN],cnt=1; int d[MAXN]; int q[MAXN],hd,tl; int n,m; int s,t; char MP[60][60]; int toth; int tots; int belh[60][60]; int bels[60][60]; int ans; inline void be(int x,int y,int z){ mp[++cnt].to=y; mp[cnt].fro=tai[x]; tai[x]=cnt; mp[cnt].v=z; } inline void bse(int x,int y,int z){ be(x,y,z); be(y,x,0); } bool bfs(){ int i,x,y; memset(d,0,sizeof(d)); hd=tl=0; d[s]=1; q[tl++]=s; while(hd!=tl){ x=q[hd++]; for(i=tai[x];i;i=mp[i].fro){ y=mp[i].to; if(!d[y]&&mp[i].v){ d[y]=d[x]+1; q[tl++]=y; } } } return d[t]; } int dfs(int x,int mx){ if(x==t){ return mx; } int i,y,tmp,re=0; for(i=tai[x];i;i=mp[i].fro){ y=mp[i].to; if(d[y]==d[x]+1&&mp[i].v){ tmp=dfs(y,min(mx,mp[i].v)); mx-=tmp; re+=tmp; mp[i].v-=tmp; mp[i^1].v+=tmp; if(!mx){ return re; } } } if(!re){ d[x]=0; } return re; } int main(){ int i,j,k; scanf("%d%d",&n,&m); for(i=1;i<=n;i++){ scanf("%s",MP[i]+1); } for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ if(!belh[i][j]&&MP[i][j]!='#'){ belh[i][j]=++toth; for(k=j+1;k<=m;k++){ if(MP[i][k]=='#'){ break; } belh[i][k]=belh[i][j]; } for(k=j-1;k;k--){ if(MP[i][k]=='#'){ break; } belh[i][k]=belh[i][j]; } } if(!bels[i][j]&&MP[i][j]!='#'){ bels[i][j]=++tots; for(k=i+1;k<=n;k++){ if(MP[k][j]=='#'){ break; } bels[k][j]=bels[i][j]; } for(k=i-1;k;k--){ if(MP[k][j]=='#'){ break; } bels[k][j]=bels[i][j]; } } } } for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ if(MP[i][j]=='*'){ bse(bels[i][j],tots+belh[i][j],1); } } } s=tots+toth+1; t=s+1; for(i=1;i<=tots;i++){ bse(s,i,1); } for(i=1;i<=toth;i++){ bse(tots+i,t,1); } while(bfs()){ ans+=dfs(s,INF); } printf("%d\n",ans); return 0; } /* 4 4 #*** *#** **#* xxx# */
相关文章推荐
- 求自定类型元素的平均
- poj 1064 Cable master(二分搜索)
- 【BZOJ-4515】游戏 李超线段树 + 树链剖分 + 半平面交
- UzysAssetsPickerController中文化
- Android Studio编译NDK app gradle配置
- sdutoj 3362 数据结构实验之图论六:村村通公路(最小生成树(裸的))
- (经典)POJ-3280 回文串DP
- appium for python client scroll to view(not in current screen)
- Partition-方案二:通过 Insert with a subquery 方法
- Android Json解析工具类
- 基于内容的图像检索引擎(以图搜图)
- Android学习笔记五:文件夹创建
- 英语作文模板
- uva624(DP)
- 在指定控件位置弹出popup window
- 操作系统 实验三 进程调度模拟程序
- Docker (一) 运行容器
- Linux驱动调试中的Debugfs的使用简介
- 欢迎使用CSDN-markdown编辑器
- 053(七十六)