此题被誉为神奇最大流,诱惑我去做了下,感觉也是通常的思路。

题意:1.用1-9去填,满足所给的行/列和要求(和那个什么游戏差不多。。。)

求一种合法方案,输出。如:

              

一看,直接就建图了,每个点在白色的点中间,由横和=纵和,管理横和的在左边,纵和的点在右边。S->横和点,纵和点到t,建图即可。

有一点注意,由于只能用1-9去填,是有上下界的网络流问题,所以这里有点比较巧妙,所有白色的点都减去1,和也对应减去几。用0做1,1做2...8做9.一一对应,实现转移为一般最大流问题。最后再加一即可。

#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxv=20100,maxe=1000101;
int nume=0;int head[maxv];int e[maxe][3];
void inline adde(int i,int j,int c)
{
e[nume][0]=j;e[nume][1]=head[i];head[i]=nume;
e[nume++][2]=c;
e[nume][0]=i;e[nume][1]=head[j];head[j]=nume;
e[nume++][2]=0;
}
int ss,tt,n,m;
int vis[maxv];int lev[maxv];
bool bfs()
{
for(int i=0;i<maxv;i++)
vis[i]=lev[i]=0;
queue<int>q;
q.push(ss);
vis[ss]=1;
while(!q.empty())
{
int cur=q.front();
q.pop();
for(int i=head[cur];i!=-1;i=e[i][1])
{
int v=e[i][0];
if(!vis[v]&&e[i][2]>0)
{
lev[v]=lev[cur]+1;
vis[v]=1;
q.push(v);
}
}
}
return vis[tt];
}
int dfs(int u,int minf)
{
if(u==tt||minf==0)return minf;
int sumf=0,f;
for(int i=head[u];i!=-1&&minf;i=e[i][1])
{
int v=e[i][0];
if(lev[v]==lev[u]+1&&e[i][2]>0)
{
f=dfs(v,minf<e[i][2]?minf:e[i][2]);
e[i][2]-=f;e[i^1][2]+=f;
sumf+=f;minf-=f;
}
}
if(!sumf) lev[u]=-1;
return sumf;
}
int dinic()
{
int sum=0;
while(bfs())sum+=dfs(ss,inf);
return sum;
}
struct cell //方块
{
int clour;
int x,y;
};
cell ces[102][102];
void read_build()
{
string ts;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
cin>>ts;
if(ts=="XXXXXXX") //黑色
{
ces[i][j].clour=0;
ces[i][j].x=ces[i][j].y=-1;
}
else if(ts==".......") //白色
{
ces[i][j].clour=5;
ces[i][j].x=ces[i][j].y=0;
}
else if(ts[0]=='X'&&ts[4]!='X') //横向要填
{
ces[i][j].clour=2;
ces[i][j].x=((ts[4]-'0')*10+(ts[5]-'0'))*10+(ts[6]-'0');
ces[i][j].y=-1;
}
else if(ts[0]!='X'&&ts[4]=='X') //纵向要填
{
ces[i][j].clour=3;
ces[i][j].y=((ts[0]-'0')*10+(ts[1]-'0'))*10+(ts[2]-'0');
ces[i][j].x=-1;
}
else //都要
{
ces[i][j].clour=4;
ces[i][j].y=((ts[0]-'0')*10+(ts[1]-'0'))*10+(ts[2]-'0');
ces[i][j].x=((ts[4]-'0')*10+(ts[5]-'0'))*10+(ts[6]-'0');
}
}
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
//cout<<ces[i][j].clour<<endl;
// cout<<i*m+j<<" ";
} for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
int counts=0;
if(ces[i][j].clour==2) //横向的
{
for(int k=j+1;k<m;k++)
{
if(ces[i][k].clour!=5)break;
adde(i*m+j,i*m+k,8);
counts++;
}
adde(ss,i*m+j,ces[i][j].x-counts);
}
else if(ces[i][j].clour==3) //纵向的
{
for(int k=i+1;k<n;k++)
{
if(ces[k][j].clour!=5)break;
adde(k*m+j,i*m+j,8);
counts++;
}
adde(i*m+j,tt,ces[i][j].y-counts);
}
else if(ces[i][j].clour==4) //都要填的,一个格子要2个编号,注意。
{ for(int k=j+1;k<m;k++)
{
if(ces[i][k].clour!=5)break;
adde(i*m+j,i*m+k,8);
counts++;
}
adde(ss,i*m+j,ces[i][j].x-counts);
counts=0;
for(int k=i+1;k<n;k++)
{
if(ces[k][j].clour!=5)break;
adde(k*m+j,i*m+j+n*m+2,8);
counts++;
}
adde(i*m+j+n*m+2,tt,ces[i][j].y-counts);
}
}
// adde(0,ss,2);
/* for(int i=0;i<=n*m+1;i++)
for(int j=head[i];j!=-1;j=e[j][1])
{
printf("%d->%d:%d\n",i,e[j][0],e[j][2]);
}*/
}
void out()
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(ces[i][j].clour!=5)printf("_");
else
{
int sflow=0;
for(int k=head[i*m+j];k!=-1;k=e[k][1]) //统计的时候只要正向边(这里注意!),其实每个点也就一条出的正向边
{
if(k%2==0)
sflow+=8-e[k][2];
}
printf("%d",sflow+1);
}
if(j==m-1)printf("\n");
else printf(" ");
}
}
void init()
{
nume=0;
memset(head,-1,sizeof(head));
ss=n*m;tt=n*m+1;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
init();
read_build();
dinic();
out();
}
return 0;
}

hdu3338 / 方格横纵和问题终极版,最大流斩的更多相关文章

  1. 08重编终极版《东邪西毒:终极版》DVD粤语中字

    1.东邪西毒].Ashes.of.Time.1994.384p.DVDRip.x264.ac3-DTMM.mkv 这个版本最清晰 ,可惜删减了,只有87分钟,粤语,1.4G. 2.东邪西毒(初始版). ...

  2. 阿里官方Java代码规范标准《阿里巴巴Java开发手册 终极版 v1.3.0》

    终极版 v1.3.0 2017年开春之际,阿里诚意献上重磅大礼:<阿里巴巴Java开发手册>,首次公开阿里官方Java代码规范标准.这套Java统一规范标准将有助于提高行业编码规范化水平, ...

  3. python3 购物车 增改查终极版~

    还是先来条NLP再说,快没了,以后想抄还没有... 十一,没有挫败,只有回应讯息 “挫败”只是指出过去的做法得不到预期的效果,是给我们需要改变的信号. “挫败”只是在事情画上句号时才能用上,欲想事情解 ...

  4. RESTful API终极版序列化封装

    urls: from django.conf.urls import url from app01 import views urlpatterns = [ # url(r"comment/ ...

  5. 通过xshell在linux上安装mysql5.7(终极版)

    通过xshell在linux上安装mysql5.7(终极版) 0)通过xshell连接到远程服务器 1)彻底删除原来安装的mysql 首先查看:rpm -qa|grep -i mysql 删除操作(一 ...

  6. 软件工程课堂作业(五)——终极版随机产生四则运算题目(C++)

    一.升级要求:让程序能接受用户输入答案,并判定对错.最后给出总共对/错的数量. 二.设计思想: 1.首先输入答案并判断对错.我想到的是定义两个数组,一个存放用户算的结果,另一个存放正确答案.每输出一道 ...

  7. 阿里正式发布《Java开发手册》终极版!

    摘要: 本文讲的是阿里正式发布<Java开发手册>终极版!,别人都说我们是码农,但我们知道,自己是个艺术家.也许我们不过多在意自己的外表和穿着,但我们不羁的外表下,骨子里追求着代码的美.质 ...

  8. 终极版Servlet——我只能提示您路过别错过

    终极版Servlet 前言:这两天看了SSM框架,本来是想往后继续学的,脑门一转又回来了,不能就这么不声不响的走了,看了这么多天的Servlet,再写最后一篇做个告别吧,这篇起名为终极版,是我现在所能 ...

  9. 微软不将《帝国时代》终极版上架Steam的原因到底是什么?

    毋庸置疑的是,<帝国时代>绝对是一款经典游戏.作为一款RTS名作,在过去的20年时间中<帝国时代>销量超过2000万部.数以千万计的玩家都沉溺于这款游戏中,<帝国时代&g ...

随机推荐

  1. 【状压dp】cf906C. Party

    需要稍加分析结论:还有一些小细节 Arseny likes to organize parties and invite people to it. However, not only friends ...

  2. 【mysql】【转发】Cannot proceed because system tables used by Event Scheduler were found damaged at server start

    本地:mac 10.12.3  mysql 5.6   远程:linux 7.3    mysql 5.7.18.  (远程数据库yum安装,又5.6升级到5.7)   步骤:从本地数据库导出数据到远 ...

  3. 安装ubuntu16.4后

    美化及配置: http://www.fant0m.com/18.html 安装pip: $ wget https://bootstrap.pypa.io/get-pip.py $ python get ...

  4. arm的开发工具

    网上有free的ide可以开发arm cortex的芯片,可以参考List of ARM Cortex-M development tools,Wikipedia,里面有emIDE,embitz等,虽 ...

  5. redis--py操作redis【转】

    Python操作redis 请给作者点赞--> 原文链接 python连接方式:点击 下面介绍详细使用 1.String 操作 redis中的String在在内存中按照一个name对应一个val ...

  6. bash的位置变量和特殊变量

    bash编程的知识点:位置变量和特殊变量 位置参数变量:         scirpt1.sh arg1 arg2 ...         $0         $1   $2   ...  ${10 ...

  7. 安装好的IIS,发布成功后打开网站出现错误

      开发web项目时需要安装IIS,在安装好IIS的Windows7本上发布asp.net网站时,web程序已经映射到了本地IIS上,但运行如下错误提示“处理程序“PageHandlerFactory ...

  8. P2598 [ZJOI2009]狼和羊的故事(最小割)

    P2598 [ZJOI2009]狼和羊的故事 题目描述 “狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......” Orez听到这首歌,心想:狼和羊如此和谐,为什么 ...

  9. UVa 1630 区间DP Folding

    一个字符串如果能简写,要么是重复多次,按题中的要求简写:要么是左右两个部分分别简写后再拼起来. dp(i, j)表示字串(i, j)所能被简写的最短的字符串. 判断一个字符串是否为周期串以及求出它的周 ...

  10. ogre3D学习基础8 --- 资源管理器

    资源管理 可管理的资源有: 材质资源:在.material文件中包含的材质脚本定义(技术.通路.纹理单元等数据的定义). 模型资源:经过优化的二进制网格模型文件,扩展名为.mesh.包含几何信息和一些 ...