Topcoder SRM570 900 CurvyonRails
题意:给定一个网格,一些格子是障碍不用管,剩余的格子是城市,你可以修建铁路,铁路的形状可以是直的或者弯的,也就是说可以以这个点为节点连接它四联通的其中两个方块。要求用一个或多个环来覆盖所有城市。对于有些关键点,如果这里是直轨道,会付出1的代价,如果不能覆盖,输出-1,否则输出最小代价。
这次该最小费用流了。x先考虑怎么判断有无解。很明显,既然是棋盘,想不染色不二分图都难。染成黑白后,对于黑点,S向其连2,黑点向周围的白点连1,白点向T连2,判断是否满流就好了。那么怎么计算代价呢?我们发现,如果要付出代价,那么一定是两个开口都给了同一列或者同一行,为了对此限制,我们拆点,分别管辖行和列。
如果这个点是黑关键点,我们向行对应的分身连一个容量1,费用0的边,再连一个容量1,费用1的边,表示如果只用一条边,不会产生费用,否则产生两条边的费用。列的话同理。
白关键点就不赘述了,其实也就是相较于反了一下。对于普通点,直接相对应的两个点分别连(2,0)就好了(因为没有限制),然后黑连向对应的白就好了。
跑费用流,不满流无解,满流输出费用即可。
- #include<bits/stdc++.h>
- using namespace std;
- #define INF 1e9
- #define N 5005
- #define id(i,j) ((i-1)*m+j)
- int n,m,TOT,S,T,P,head[N],d[N],a[N],p[N],cnt;
- bool vis[N];
- queue<int>q;
- char field[N][N];
- inline int read(){
- int x=,f=; char a=getchar();
- while(a<'' || a>'') {if(a=='-') f=-; a=getchar();}
- while(a>='' && a<='') x=x*+a-'',a=getchar();
- return x*f;
- }
- struct edges{
- int fr,to,cap,flow,cost,next;
- }e[*N];
- inline void insert(int u,int v,int f,int c){
- e[cnt]=(edges){u,v,f,,c,head[u]};head[u]=cnt++;
- e[cnt]=(edges){v,u,,,-c,head[v]};head[v]=cnt++;
- }
- inline bool spfa(){
- memset(d,0x3f,sizeof(d));
- d[S]=; a[S]=INF; q.push(S);
- while(!q.empty()){
- int x=q.front(); q.pop(); vis[x]=;
- for(int i=head[x];i>=;i=e[i].next)
- if(d[e[i].to]>d[x]+e[i].cost && e[i].flow<e[i].cap){
- d[e[i].to]=d[x]+e[i].cost; p[e[i].to]=i;
- a[e[i].to]=min(a[x],e[i].cap-e[i].flow);
- if(!vis[e[i].to]) vis[e[i].to]=,q.push(e[i].to);
- }
- }
- return d[T]<INF;
- }
- inline int mincf(){
- int u=T;
- while(u!=S){
- e[p[u]].flow+=a[T];
- e[p[u]^].flow-=a[T];
- u=e[p[u]].fr;
- }
- TOT-=a[T];
- return a[T]*d[T];
- }
- int main(){
- n=read(); m=read();
- for(int i=;i<=n;i++)
- scanf("%s",field[i]+);
- S=; T=*n*m+; P=n*m; TOT=;
- memset(head,-,sizeof(head));
- for(int i=;i<=n;i++)
- for(int j=;j<=m;j++){
- if(field[i][j]=='w') continue;
- if((i+j)%==){
- insert(S,id(i,j),,); TOT+=;
- if(field[i][j]!='C') insert(id(i,j),id(i,j)+*P,,),insert(id(i,j),id(i,j)+P,,);
- else {
- insert(id(i,j),id(i,j)+P,,); insert(id(i,j),id(i,j)+P,,);
- insert(id(i,j),id(i,j)+*P,,); insert(id(i,j),id(i,j)+*P,,);
- }
- if(j-> && field[i][j-]!='w') insert(id(i,j)+P,id(i,j-)+P,,);
- if(j+<=m && field[i][j+]!='w' ) insert(id(i,j)+P,id(i,j+)+P,,);
- if(i-> && field[i-][j]!='w') insert(id(i,j)+*P,id(i-,j)+*P,,);
- if(i+<=n && field[i+][j]!='w') insert(id(i,j)+*P,id(i+,j)+*P,,);
- }else{
- insert(id(i,j),T,,);
- if(field[i][j]!='C') insert(id(i,j)+*P,id(i,j),,),insert(id(i,j)+P,id(i,j),,);
- else{
- insert(id(i,j)+P,id(i,j),,); insert(id(i,j)+P,id(i,j),,);
- insert(id(i,j)+*P,id(i,j),,); insert(id(i,j)+*P,id(i,j),,);
- }
- }
- }
- int ans=;
- while(spfa()) ans+=mincf();
- if(TOT) ans=-;
- printf("%d\n",ans);
- }
Topcoder SRM570 900 CurvyonRails的更多相关文章
- Topcoder SRM570 D1L3 CurvyonRails
几个样例: 5 5wCCwwwCC....w......www..wReturns: 0 3 3C.w....C.Returns: 1 21 20CC..CCCw.CwC..CC.w.CC.CCCwC ...
- Topcoder口胡记 SRM 562 Div 1 ~ SRM 599 Div 1
据说做TC题有助于提高知识水平? :) 传送门:https://284914869.github.io/AEoj/index.html 转载请注明链接:http://www.cnblogs.com/B ...
- Topcoder SRM 618 Div2 --900
题意:给定两个NxN的棋盘,每个棋盘都有一个‘车’的摆放状态,问进行若干次交换,能否使棋盘1变为棋盘2. 交换规则:每次选两个‘车’,坐标分别为(r1,c1),(r2,c2),如果r1<r2并且 ...
- TopCoder SRM 559 Div 1 - Problem 900 CircusTents
传送门:https://284914869.github.io/AEoj/559.html 题目简述: n个实心圆,两两没有交集,在第一个圆上找一个点,使得它到另外一个圆上某个点的最短距离的最小值尽量 ...
- TopCoder SRM 701 Div2 Problem 900 ThueMorseGame(博弈+预处理)
题意 Alice和Bob在玩一个游戏,Alice先手. 每次一个人可以从一堆式子中拿走任意数量(不超过m)的式子. 取走最后一颗式子的人胜利. 当一个取完某一步的时候剩下的石子数量的二进制表示中1的 ...
- TopCoder[SRM587 DIV 1]:ThreeColorability(900)
Problem Statement There is a H times W rectangle divided into unit cells. The rows of cells are ...
- TopCoder入门
TopCoder入门 http://acmicpc.info/archives/164?tdsourcetag=s_pctim_aiomsg 本文根据经典的TC教程完善和改编.TopCoder:htt ...
- ORA-00494: enqueue [CF] held for too long (more than 900 seconds) by 'inst 1, osid 5166'
凌晨收到同事电话,反馈应用程序访问Oracle数据库时报错,当时现场现象确认: 1. 应用程序访问不了数据库,使用SQL Developer测试发现访问不了数据库.报ORA-12570 TNS:pac ...
- TopCoder kawigiEdit插件配置
kawigiEdit插件可以提高 TopCoder编译,提交效率,可以管理保存每次SRM的代码. kawigiEdit下载地址:http://code.google.com/p/kawigiedit/ ...
随机推荐
- HQL查询——HQL查询的基本用法
HQL查询--HQL查询的基本用法 1.HQL语法类似于SQL语法,但是需要注意的是,HQL是一种完全面向对象的查询语言.SQL语言操作的对象是数据表.列等数据库对象,而HQL语言的操作对象是类.实例 ...
- smarty模板引擎
1. 使用smarty 1.1 项目引入 // 3, 连接数据库,提取相关数据 $title = "Smarty模板引擎"; $content = "Smarty模 ...
- Virtualbox中不能为虚拟机打开一个新任务的原因及解决方法
VirtualBox新建虚拟机时报错,不能为虚拟机打开一个新任务的原因 解决办法如下 1.保证bios里的virtualization technology的选项开启,不同电脑BIOS设置可能会不一样 ...
- 关于django访问默认后台admin的时候提示403错误,
Forbidden (403) CSRF verification failed. Request aborted. You are seeing this message because this ...
- 【开园 and 计划】
开园 啊啊啊啊啊啊啊啊,郁闷啊,头一回写博客,一刻钟前保存的草稿为何荡然无存??? 那少废话直击要点:今日乃我开园之日,开园为了改变.为了学习.为了积累. 计划 最长为时 3月,截止到 2016年9月 ...
- 如何实现修改FileUpload样式
这里先隐藏FileUpload 然后用一个input button和一个text来模拟FileUpload 具体代码为 <asp:FileUpload ID="FileUpload1& ...
- PhpStorm配置svn时提示需要证书:authentication required的解决方法,总是弹出
总是弹出下面的框框,每次输入svn账号密码,还是不行. 于是上网查了半天,需要安装和配置SlikSvn.于是就下载安装了. 完了还是不行,就尝试着配置. 上面和下面的加上,svn.exe的地址. 再次 ...
- mybatis mysql 调用视图
java代码 @RequestMapping(value = "/testView", method = RequestMethod.GET) public @ResponseBo ...
- js_多个引号的用法
str += "<input id='sel_DayB' width='120' onfocus=\"WdatePicker({skin:'whyGreen',dateFmt ...
- arm指令周期
1.大部分算术运算和逻辑运算指令都是单周期的,例如加法.减法.位级运算和移位 2.乘法指令根据操作数位数的不同,从2-5个周期都有可能. 3.无条件跳转语句和跳转语句成功跳转,需要重新填充流水线,因此 ...