几个样例:

5 5
wCCww
wCC..
..w..
....w
ww..w
Returns: 0

3 3
C.w
...
.C.
Returns: 1

21 20
CC..CCCw.CwC..CC.w.C
C.CCCwCCC.w.w..C.w..
wwww...CC.wC.Cw.CC..
CC..CC.w..w.C..CCCC.
CC.CCC..CwwCCC.wCC..
w.C..wwCC.CC.wwwCC..
.CC.CC..CCC..CC.CC.C
Cw....C.C.CCC...CC..
CC.C..Cww.C.CwwwC..w
wCCww..C...CCCCCCC.w
C.CCw.CC.ww...C.CCww
C.C.C.CCwCC..wCCw.Cw
CCC.C...w..C.wC.wCCw
CC.C..C..CCC.CC.C...
C.ww...CCC..CC...CCC
...CCC.CwwwC..www.C.
wwCCCCC.w.C.C...wCwC
CCwC.CwCCC.C.w.Cw...
C.w.wC.CC.CCC.C.w.Cw
CCw.CCC..C..CC.CwCCw
C.wwwww.CwwCCwwwwwww
Returns: 9

分析:非常好的一道题!

   这道题和bzoj3171非常像.是一类容量表示限制的题,即要求的东西有许多限制,通过限定容量大小来满足这些限制. 因为和容量大小有关,所以这些限制一般为数字上的限制.

   遇到这类题该怎么做呢?

   1.题目肯定会让你求满足条件的情况下的最值.首先要分析得到怎么样才能满足条件,一定要找到数字关系!

   2.容量大小代表数字限制,建一个直观的最大流模型.

   3.拆点,将有花费的操作连成对应的有费用的边.

   如何建呢?

   首先找到初始状态,即所有边都是没有任何费用的. 例如bzoj3171题目中给出的箭头,本题中将所有的轨道变成弯的就是初始状态了. 接着找到需要费用的边. 例如bzoj3171中的更改箭头方向,本题中的将一个弯的轨道变成直的轨道(有弯星人在上面的). 最后检查建出来的图是否满足要求:存在对应关系:满足限制即满流.

   对于这道题而言,每一个空地必须伸出两个轨道,每个点有直的铁轨和弯的铁轨.

   直的铁轨即,一块空地连出两条横向或纵向的轨道。弯的铁轨即,一块空地连出一条横向和一条纵向的轨道。

一个点两种不同的类别,这启示我们拆点分类.对于每一个点拆成两个点,一个是横着的点,伸出两个横着的轨道,一个是竖着的点,伸出两个竖着的轨道.它们都只和相邻的没有障碍的点拆出来的对应点相连,容量为1,费用为0

   有费用的边即同一个点拆出来的两个点,如果这个点上有弯星人,它们之间的费用则为1,否则为0,容量为1.

   那么和源汇的边要怎么处理呢?

   错误的做法:一个点既连源点又连汇点. 显然这样源点会直接通过这个点走到汇点,不行.

   正确的做法是黑白染色!相当于把图看作二分图. 对于图上做网络流,连边的问题通常用这种方法解决.

   事实上也不需要真的dfs去染色,只需要看行数+列数是奇数还是偶数即可.

   最后要先判断是否满流,再来输出解.

   挺好的题,将限制与容量联系起来,是一类较为常见的题型.get到了新姿势:黑白染色建图.

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std;
const int maxn = ,dx[] = {,,,-},dy[] = {,-,,},inf = 0x7fffffff;
int n,m,head[maxn],to[maxn * ],nextt[maxn * ],w[maxn * ],cost[maxn * ],tot = ;
int S,T,ans,anss,sum;
int vis[maxn],vis2[maxn],d[maxn];
char s[maxn][maxn]; void add(int x,int y,int z,int p)
{
cost[tot] = p;
w[tot] = z;
to[tot] = y;
nextt[tot] = head[x];
head[x] = tot++; cost[tot] = -p;
w[tot] = ;
to[tot] = x;
nextt[tot] = head[y];
head[y] = tot++;
} bool spfa()
{
for (int i = ; i <= T; i++)
d[i] = inf;
memset(vis,,sizeof(vis));
memset(vis2,,sizeof(vis2));
d[S] = ;
vis[S] = ;
queue <int> q;
q.push(S);
while (!q.empty())
{
int u = q.front();
q.pop();
vis[u] = ;
for (int i = head[u];i;i = nextt[i])
{
int v = to[i];
if (w[i] && d[v] > d[u] + cost[i])
{
d[v] = d[u] + cost[i];
if (!vis[v])
{
vis[v] = ;
q.push(v);
}
}
}
}
return d[T] < inf;
} int dfs(int u,int f)
{
if (u == T)
{
ans += d[u] * f;
return f;
}
int res = ;
vis2[u] = ;
for (int i = head[u];i;i = nextt[i])
{
int v = to[i];
if (!vis2[v] && w[i] && d[v] == d[u] + cost[i])
{
int temp = dfs(v,min(f - res,w[i]));
w[i] -= temp;
w[i ^ ] += temp;
res += temp;
if (res == f)
return res;
}
}
return res;
} void dinic()
{
while (spfa())
anss += dfs(S,inf);
} int calc(int x,int y)
{
return (x - ) * m + y;
} int main()
{
scanf("%d%d",&n,&m);
S = n * m * + ;
T = S + ;
for (int i = ; i <= n; i++)
scanf("%s",s[i] + );
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++)
{
if (s[i][j] == 'w')
continue;
int temp = calc(i,j);
if ((i + j) % == )
{
sum += ;
add(S,calc(i,j),,);
add(S,calc(i,j) + n * m,,);
//横
if (j - > && s[i][j - ] != 'w')
add(calc(i,j),calc(i,j - ),,);
if (j + <= m && s[i][j + ] != 'w')
add(calc(i,j),calc(i,j + ),,);
//竖
if (i - > && s[i - ][j] != 'w')
add(calc(i,j) + n * m,calc(i - ,j) + n * m,,);
if (i + <= n && s[i + ][j] != 'w')
add(calc(i,j) + n * m,calc(i + ,j) + n * m,,);
}
else
{
add(calc(i,j),T,,);
add(calc(i,j) + n * m,T,,);
}
int p = ;
if (s[i][j] == 'C')
p = ;
add(calc(i,j),calc(i,j) + n * m,,p);
add(calc(i,j) + n * m,calc(i,j),,p);
}
dinic();
if (anss != sum)
ans = -;
printf("%d\n",ans); return ;
}

Topcoder SRM570 D1L3 CurvyonRails的更多相关文章

  1. Topcoder SRM570 900 CurvyonRails

    题意:给定一个网格,一些格子是障碍不用管,剩余的格子是城市,你可以修建铁路,铁路的形状可以是直的或者弯的,也就是说可以以这个点为节点连接它四联通的其中两个方块.要求用一个或多个环来覆盖所有城市.对于有 ...

  2. @topcoder - SRM766R1 D1L3@ ShortestMissingSubsequences

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个大小为 G 的字符集,并给定一个长度为 N 的字符串 A ...

  3. @topcoder - 2013TCO3A D1L3@ TrickyInequality

    目录 @description@ @accepted code@ @accepted code@ @details@ @description@ 现有不等式组: \[\begin{cases} x_1 ...

  4. Topcoder口胡记 SRM 562 Div 1 ~ SRM 599 Div 1

    据说做TC题有助于提高知识水平? :) 传送门:https://284914869.github.io/AEoj/index.html 转载请注明链接:http://www.cnblogs.com/B ...

  5. TopCoder kawigiEdit插件配置

    kawigiEdit插件可以提高 TopCoder编译,提交效率,可以管理保存每次SRM的代码. kawigiEdit下载地址:http://code.google.com/p/kawigiedit/ ...

  6. 记第一次TopCoder, 练习SRM 583 div2 250

    今天第一次做topcoder,没有比赛,所以找的最新一期的SRM练习,做了第一道题. 题目大意是说 给一个数字字符串,任意交换两位,使数字变为最小,不能有前导0. 看到题目以后,先想到的找规律,发现要 ...

  7. TopCoder比赛总结表

    TopCoder                        250                              500                                 ...

  8. Topcoder几例C++字符串应用

    本文写于9月初,是利用Topcoder准备应聘时的机试环节临时补习的C++的一部分内容.签约之后,没有再进行练习,此文暂告一段落. 换句话说,就是本文太监了,一直做草稿看着别扭,删掉又觉得可惜,索性发 ...

  9. TopCoder

    在TopCoder下载好luncher,网址:https://www.topcoder.com/community/competitive%20programming/ 选择launch web ar ...

随机推荐

  1. 002 -- MySQL的逻辑架构

                                            msql的逻辑架构图 第一层:主要功能是连接处理.授权认证.安全等.相当于JavaEE中的常说的Web层 第二层:包含了 ...

  2. 240. 搜索二维矩阵 II

    二维数组搜索 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性: 每行的元素从左到右升序排列. 每列的元素从上到下升序排列. 示例: 现有矩阵 ...

  3. 【转】: 塞尔达组在GDC2017演讲的文字翻译:显示的力量

      塞尔达系列推出新作的时候,美术风格都有明显变化.本作的风格比起写实,笔触轻快变化幅度大是其特征.2011年公开的技术演示中,画面风格要更加写实.最终版则更接近于卡通.5年里到底发生了什么呢? ▲2 ...

  4. hdu - 6282,2018CCPC湖南全国邀请赛G题,字符串,规律

    HDU – 6282 http://acm.hdu.edu.cn/showproblem.php?pid=6282 by Hzu_Tested 题意:给出两个字符串S和T,只由a,b,c三种字符组成( ...

  5. How to pass an Amazon account review

    Have you ever sold products on Amazon? How about sold so much within the first week that amazon deci ...

  6. 一个小时搭建一个全栈 Web 应用框架

    把想法变为现实的能力是空想家与实干家的区别.不管你是在一家跨国公司工作,还是正在为自己的创业公司而努力,那些有能力将创意转化为真正产品的人,都具有宝贵的技能并拥有明显的实力.如果你能在不到一个小时的时 ...

  7. OpenFlow协议

    功能 1.0版本Openflow:控制器通过Openflow协议与交换机建立了安全通道(Sceure Channel),下发流表. 1.3版本Openflow:多控制器,多流表. 用于实现Contro ...

  8. 【IdentityServer4文档】- 启动和概览

    启动和概览 有两种基本的方式来启动一个新的 IdentityServer 项目: 从空项目开始(从头开始) 从 Visual Studio 的 ASP.NET Identity 模板开始 假如您从头开 ...

  9. Struts2(二)

    以下内容是基于导入struts2-2.3.32.jar包来讲的 1.关于StrutsPrepareAndExecuteFilter 启动StrutsPrepareAndExecuteFilter时加载 ...

  10. 6/2 sprint2 看板和燃尽图的更新