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

题意: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. 【线段树 扫描线 二维数点】loj#6276. 果树

    路径计数转成二维数点很妙啊 题目描述 NiroBC 姐姐是个活泼的少女,她十分喜欢爬树,而她家门口正好有一棵果树,正好满足了她爬树的需求. 这颗果树有 $N$ 个节点,标号 $1 \ldots N$ ...

  2. python入门:输出1-10的所有数

    #!/usr/bin/env python # -*- coding:utf-8 -*- #输出1-10的所有数 """ 变量kaishi的赋值为数字1,while 真, ...

  3. 通过代码链接ftp上传下载删除文件

    因为我的项目是Maven项目,首先要导入一个Maven库里的包:pom.xml <dependency>            <groupId>com.jcraft</ ...

  4. Nastya Studies Informatics CodeForces - 992B (大整数)

    B. Nastya Studies Informatics time limit per test 1 second memory limit per test 256 megabytes input ...

  5. MIP启发式算法:遗传算法 (Genetic algorithm)

    *本文主要记录和分享学习到的知识,算不上原创 *参考文献见链接 本文主要讲述启发式算法中的遗传算法.遗传算法也是以local search为核心框架,但在表现形式上和hill climbing, ta ...

  6. TM1637驱动程序

    /***************************************************************************** *版权信息:深圳天微电子有限公司 *文 件 ...

  7. js 常用判断

    JS三元运算符 三元运算符: 如名字表示的三元运算符需要三个操作数. 语法是 条件 ? 结果1 : 结果2;. 这里你把条件写在问号(?)的前面后面跟着用冒号(:)分隔的结果1和结果2.满足条件时结果 ...

  8. JS实现——计算两日期之差

    在网上找了个js实现的,根据相差天数计算日期和根据两个日期计算相差多少天的示例和代码: 根据相差天数计算日期: 距离: 年 月 日 相差: 天 (输入负数则往前计算) 日期是:   根据日期计算相差天 ...

  9. luogu1939 【模板】矩阵加速(数列)

    upd:现在推荐使用一个长度为 \(n\) 的一维向量.若状态矩阵 \(F\) 对下一时间的状态矩阵 \(F'\) 有影响,则 \(F'=FA\) 中的 转移矩阵 \(A\) 的赋值方法是: 若状态矩 ...

  10. SQL中,WHERE HAVING的区别

    WHERE是约束声明,是用来约束选数据库中储存的值的,其是在查询返回结果集之前起作用,其必须作用于数据库中存在的值,因此不能用聚合函数(avg,sum,count等,因为这些函数返回的值并非数据库中储 ...