Topcoder SRM570 D1L3 CurvyonRails
几个样例:
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的更多相关文章
- Topcoder SRM570 900 CurvyonRails
题意:给定一个网格,一些格子是障碍不用管,剩余的格子是城市,你可以修建铁路,铁路的形状可以是直的或者弯的,也就是说可以以这个点为节点连接它四联通的其中两个方块.要求用一个或多个环来覆盖所有城市.对于有 ...
- @topcoder - SRM766R1 D1L3@ ShortestMissingSubsequences
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个大小为 G 的字符集,并给定一个长度为 N 的字符串 A ...
- @topcoder - 2013TCO3A D1L3@ TrickyInequality
目录 @description@ @accepted code@ @accepted code@ @details@ @description@ 现有不等式组: \[\begin{cases} x_1 ...
- Topcoder口胡记 SRM 562 Div 1 ~ SRM 599 Div 1
据说做TC题有助于提高知识水平? :) 传送门:https://284914869.github.io/AEoj/index.html 转载请注明链接:http://www.cnblogs.com/B ...
- TopCoder kawigiEdit插件配置
kawigiEdit插件可以提高 TopCoder编译,提交效率,可以管理保存每次SRM的代码. kawigiEdit下载地址:http://code.google.com/p/kawigiedit/ ...
- 记第一次TopCoder, 练习SRM 583 div2 250
今天第一次做topcoder,没有比赛,所以找的最新一期的SRM练习,做了第一道题. 题目大意是说 给一个数字字符串,任意交换两位,使数字变为最小,不能有前导0. 看到题目以后,先想到的找规律,发现要 ...
- TopCoder比赛总结表
TopCoder 250 500 ...
- Topcoder几例C++字符串应用
本文写于9月初,是利用Topcoder准备应聘时的机试环节临时补习的C++的一部分内容.签约之后,没有再进行练习,此文暂告一段落. 换句话说,就是本文太监了,一直做草稿看着别扭,删掉又觉得可惜,索性发 ...
- TopCoder
在TopCoder下载好luncher,网址:https://www.topcoder.com/community/competitive%20programming/ 选择launch web ar ...
随机推荐
- HackRF One硬件架构及参数简介
本文内容.开发板及配件仅限用于学校或科研院所开展科研实验! 淘宝店铺名称:开源SDR实验室 HackRF链接:https://item.taobao.com/item.htm?spm=a1z10.1- ...
- 做程序开发的你如果经常用Redis,这些问题肯定会遇到
分布式缓存Redis是一种支持Key-Value等多种数据结构的存储系统.可用于缓存.事件发布或订阅.高速队列等多种场景.Redis使用ANSI C语言编写,提供字符串(String).哈希(Hash ...
- jQuery 判断浏览器
jQuery 浏览器判断,jQuery提供了一个 jQuery.browser 方法 来判断浏览器 可用值: safari opera msie mozilla 例如:if($.brows ...
- 亚马逊拟斥资15亿美元建航空货运中心 - Amazon to spend $1.49 bln on air cargo hub, fans talk of bigger ambitions - ReutersFebruary 1, 2017
2月1日消息,亚马逊本周二宣布将在肯塔基州开建其第一个航空货运中心,以应对高速增长的航空货运需求.亚马逊预计,该项目将带来2000个工作岗位. 据悉,该项计划总投入约为15亿美元,亚马逊或可从当地政府 ...
- 软件工程-东北师大站-第七次作业(PSP)
1.本周PSP 2.本周进度条 3.本周累计进度图 代码累计折线图 博文字数累计折线图 4.本周PSP饼状图
- c# 修改exe.config文件并且及时更新
1.config文件地址:AppDomain.CurrentDomain.SetupInformation.ConfigurationFile 注意:如果是在调试程序中运行,此地址指代的是vhost. ...
- ARP 攻击
场景 A攻击者 192.168.1.3 00:00:00:00:00:01 B受害者 192.168.1.2 00:00:00:00:00:02 C路由器 192.168.1.1 00:00:00:0 ...
- lintcode-107-单词切分
107-单词切分 给出一个字符串s和一个词典,判断字符串s是否可以被空格切分成一个或多个出现在字典中的单词. 样例 给出 s = "lintcode" dict = [" ...
- 2nd 四人小组项目的进一步分析
组长:林莉 组员:王东涵.宫丽君.胡丽娜 项目选题:车辆管理系统(附加相关员工管理) 项目期限:暂定十周 一.NABCD模型 N-Need 需求分析及相应功能设置 需求概述: 管理库中车辆信息.相关人 ...
- $(document).click() 在苹果手机上不能正常运行解决方案
本来是如下一段跳转代码,发现在安卓和微信开发者工具上都能正常运行,但是苹果手机就不行了. $(document).on('click', '.url', function(){ location.hr ...