Zoj1654

标准解法:二分匈牙利。

写法各异嘛,看不懂或者懒得看也正常,如果想了解我思路的可以和我讨论的。

在练习sap,所以还是写了一遍:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<memory.h>
#include<cmath>
using namespace std;
char c[51][51];
const int M=1000000; int L,R,s,t,cnt;
int a[51][51],b[51][51];//a是x轴的标号,b是y的
const int inf=1000000;
int vd[2501],dis[2501],ans,m,n;
int Laxt[M],Next[M],Val[M],To[M];
void _update()
{
memset(vd,0,sizeof(vd));
memset(dis,0,sizeof(dis));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(To,0,sizeof(To));
memset(Laxt,0,sizeof(Laxt));
memset(Next,0,sizeof(Next));
memset(Val,0,sizeof(Val));
ans=0;
cnt=2;
s=0;
}
int dfs(int u,int flow)
{
int temp,delta;
if(u==t)return flow;
delta=0;
for(int i=Laxt[u];i>0;i=Next[i]) //这里的0限制了cnt不从0开始
if(Val[i]>0 && dis[u]==dis[To[i]]+1)
{
temp=dfs(To[i],min(flow-delta,Val[i]));
Val[i]-=temp;
Val[i^1]+=temp; delta+=temp;
if(delta==flow||dis[s]>t) return delta;
}
vd[dis[u]]--;
if(vd[dis[u]]==0)dis[s]=t+1;
dis[u]++;
vd[dis[u]]++;
return delta;
}
void _bh()//标号
{
L=0;
for(int i=1;i<=n;i++)
{
bool ok=false;
for(int j=1;j<=m;j++)
if(ok&&c[i][j]!='#') a[i][j]=L;
else if(ok&&c[i][j]=='#') ok=false;
else if(!ok&&c[i][j]!='#') {
a[i][j]=++L;
ok=true;
}
}
R=L;
for(int i=1;i<=m;i++)
{
bool ok=false;
for(int j=1;j<=n;j++)
if(ok&&c[j][i]!='#') b[j][i]=R;
else if(ok&&c[j][i]=='#') ok=false;
else if(!ok&&c[j][i]=='o') {
b[j][i]=++R;
ok=true;
}
}
t=R+1;
}
void _add(int u,int v,int w)
{
Next[cnt]=Laxt[u];
Laxt[u]=cnt;
To[cnt]=v;
Val[cnt++]=w; Next[cnt]=Laxt[v];
Laxt[v]=cnt;
To[cnt]=u;
Val[cnt++]=0;
}
int main()
{
int T;
cin>>T;
for(int tt=1;tt<=T;tt++){
cin>>n>>m;
_update();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>c[i][j];
_bh();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(c[i][j]=='o')
_add(a[i][j],b[i][j],1);
for(int i=1;i<=L;i++)
_add(s,i,1);
for(int i=L+1;i<=+R;i++)
_add(i,t,1);
while(dis[s]<t+1)
{
int flow=dfs(s,inf);
ans+=flow;
}
printf("Case :%d\n%d\n",tt,ans);
}
return 0;
}

ZOJ1654 Place the Robots的更多相关文章

  1. ZOJ1654 Place the Robots(二分图最大匹配)

    最大匹配也叫最大边独立集,就是无向图中能取出两两不相邻的边的最大集合. 二分图最大匹配可以用最大流来解. 如果题目没有墙,那就是一道经典的二分图最大匹配问题: 把地图上的行和列分别作为点的X部和Y部, ...

  2. zoj1654 Place the Robots 二分图最大匹配

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=654 将每一行的包含空地的区域编号 再将每一列的包含空地的区域编号 然 ...

  3. 网站 robots.txt 文件编写

    网站 robots.txt 文件编写 Intro robots.txt 是网站根目录下的一个纯文本文件,在这个文件中网站管理者可以声明该网站中不想被robots访问的部分,或者指定搜索引擎只收录指定的 ...

  4. Robots.txt - 禁止爬虫(转)

    Robots.txt - 禁止爬虫 robots.txt用于禁止网络爬虫访问网站指定目录.robots.txt的格式采用面向行的语法:空行.注释行(以#打头).规则行.规则行的格式为:Field: v ...

  5. (转载)robots.txt写法大全和robots.txt语法的作用

    1如果允许所有搜索引擎访问网站的所有部分的话 我们可以建立一个空白的文本文档,命名为robots.txt放在网站的根目录下即可.robots.txt写法如下:User-agent: *Disallow ...

  6. 2016 ccpc 网络选拔赛 F. Robots

    Robots Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  7. robots.txt文件没错,为何总提示封禁

    大家好,我的robots.txt文件没错,为何百度总提示封禁,哪位高人帮我看看原因,在此谢过. 我的站点www.haokda.com,robots.txt如下: ## robots.txt for P ...

  8. robots笔记以免忘记

    html头部标签写法: <meta name="robots" content="index,follow" /> content中的值决定允许抓取 ...

  9. springMVC robots.txt 处理

    正常情况这样就好使 <mvc:resources mapping="/robots.txt" location="/lib/robots.txt"/> ...

随机推荐

  1. oracle12c之 单机12.1.0.1打补丁

    1. 下载最新的12.1.0.1的DB PSU 与 OPatchp23054354_121010_Linux-x86-64.zipp6880880_121010_Linux-x86-64.zip 2. ...

  2. 团队作业8——第二次项目冲刺(Beta阶段)5.21

    1.当天站立式会议照片 会议内容: 本次会议为第三次会议 本次会议在陆大楼2楼召开,本次会议内容: ①:检查总结第二次任务完成情况 ②:布置第三次任务的详细分工 ③:规定完成时间是在第四次任务之前 ④ ...

  3. 个人作业2——英语学习APP的案例分析

    第一部分:调研.评测 1.刚刚打开必应词典的时候,它给我的第一反应就是界面美观,最上面是一个查询框,下面有一些经典的句子.单词以及一些精选的文章,所有的功能都可以一目了然,看一眼就知道要怎么去使用,这 ...

  4. 201521123072《java程序设计》第八周总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 List中指定元素的删除(题目4-1) 1.1 实验总结 在删除List中的元素中要考虑元素删 ...

  5. 201521123119《Java程序设计》第8周学习总结

    1. 本周学习总结 2. 书面作业 Q1.List中指定元素的删除(题目4-1) Q1.1 实验总结 用split(" ")方法将list转化为字符串数组.要注意行中含有多个空格的 ...

  6. 201521123092《java程序设计》第八周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 选做:收集你认为有用的代码片段 2. 书面作业 本次作业题集集合 1.List中指定元素的删除(题目4 ...

  7. 201521123039 《java程序设计》第四周学习总结

    1. 本周学习总结 总结: 1.提到类的继承就会想到继承层次的问题,一般我们都将子类和父类共同的特征放到父类中,将具有特殊用途的方法放在子类中,这样可以有效避免代码冗余. 2.覆盖与重载是不同的概念, ...

  8. 201521123063 《Java程序设计》第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 网络通讯的两种方式 TCP方式:类似于打电话,能够建立专门的虚拟连接,数据传输可靠 UDP方式:类似与发短 ...

  9. 201521123059 《Java程序设计》第十四周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 1.关系型数据库 --建立表格时表中一列中的数据类型必须一致.关系表中的行必须是唯一的,列是不可分的,某些行的某 ...

  10. 201521123080《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 流(Stream): Stream是从起源(source)到接收(sink)的有序数据 按照流向分可以分为输入 ...