P3965 [TJOI2013]循环格

题目背景

一个循环格就是一个矩阵,其中所有元素为箭头,指向相邻四个格子。

每个元素有一个坐标(行,列),其中左上角元素坐标为\((0,0)\)。给定一个起始位\((r,c)\),你可以沿着箭头方向在格子间行走。

即:如果\((r,c)\)是一个左箭头,那么走到\((r,c-1)\);如果是一个右箭头,走到\((r,c+1)\);如果是上箭头,走到\((r-1,c)\);如果是下箭头,走到\((r+1,c)\)。

每一行和每一列都是循环的,即如果走出边界,你会出现在另一侧。比如在一个\(5*5\)的循环格里,从\((3,0)\)向左走会出现在\((3,4)\)。

题目描述

一个完美的循环格是这样定义的:对于任意一个起始位置,你都可以沿着箭头最终回到起始位置。

如果一个循环格不满足完美,你可以随意修改任意一个元素的箭头直到完美。

给定一个循环格,你需要计算最少需要修改多少个元素使其完美。

输入输出格式

输入格式:

第一行两个整数\(R\)和\(C\),表示循环格的行和列。接下来\(R\)行,每一行包含\(C\)个字符\(LRUD\)表示左右上下

输出格式:

一个整数,表示最少需要修改多少个元素使得给定的循环格完美。

说明

数据范围

\(30\%\)的数据,\(1 ≤ R, C ≤ 7\)

\(100\%\)的数据,\(1 ≤ R, C ≤ 15\)


这个是一个\(|V|=|E|\)的图,要每个点都在环上,要求每个点的入度和出度都是\(1\),然后幻视一下,感觉和最小路径覆盖有点像,拆个点放到两边,连可以到达的点,最大流量就限制了入度出度都是\(1\),然后安装原来的连边分配一下费用,跑最小费用最大流就可以了。


Code:

#include <cstdio>
#include <cstring>
const int dx[5]={0,-1,0,1,0};
const int dy[5]={0,0,1,0,-1};
const char cp[5]={'%','U','R','D','L'};
const int N=1000;
const int inf=0x3f3f3f3f;
int n,r,c,s,t;
char yuy[20];
int head[N],to[N<<3],Next[N<<3],edge[N<<3],cost[N<<3],cnt=1;
void add(int u,int v,int w,int c)
{
to[++cnt]=v,edge[cnt]=w,cost[cnt]=c,Next[cnt]=head[u],head[u]=cnt;
to[++cnt]=u,edge[cnt]=0,cost[cnt]=-c,Next[cnt]=head[v],head[v]=cnt;
}
int dis[N],q[N*N],pre[N];
bool spfa()
{
memset(dis,0x3f,sizeof dis);
int l,r;
dis[q[l=r=1]=s]=0;
while(l<=r)
{
int now=q[l++];
for(int v,i=head[now];i;i=Next[i])
if(edge[i]&&dis[v=to[i]]>dis[now]+cost[i])
{
dis[v]=dis[now]+cost[i];
pre[v]=i;
q[++r]=v;
}
}
return dis[t]!=inf;
}
int main()
{
scanf("%d%d",&r,&c);
n=r*c,s=(n<<1)+1,t=s+1;
for(int i=1;i<=r;i++)
{
scanf("%s",yuy+1);
for(int j=1;j<=c;j++)
{
int u=(i-1)*c+j;
for(int k=1;k<=4;k++)
{
int ti=i+dx[k],tj=j+dy[k];
ti=(ti+r-1)%r+1,tj=(tj+c-1)%c+1;
int v=(ti-1)*c+tj;
add(u,v+n,1,yuy[j]!=cp[k]);
}
}
}
for(int i=1;i<=n;i++) add(s,i,1,0);
for(int i=1;i<=n;i++) add(i+n,t,1,0);
int ans=0;
while(spfa())
{
ans+=dis[t];
int now=t;
while(pre[now])
{
--edge[pre[now]];
++edge[pre[now]^1];
now=to[pre[now]^1];
}
}
printf("%d\n",ans);
return 0;
}

2019.2.14

洛谷 P3965 [TJOI2013]循环格 解题报告的更多相关文章

  1. 洛谷 P3962 [TJOI2013]数字根 解题报告

    P3962 [TJOI2013]数字根 题意 数字根:这个数字每一位的数字加起来求和,反复这个过程直到和小于10. 给出序列\(a\),询问区间\([l,r]\)连续的子区间里最大前5个不同的数字根, ...

  2. 洛咕 P3965 [TJOI2013]循环格

    同tjoi2010 打扫房间,每个点入度,出度都为1,可以向相邻4个点连边,但只有原来存在的边费用为0. // luogu-judger-enable-o2 #include<bits/stdc ...

  3. 洛谷_Cx的故事_解题报告_第四题70

    1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h>   struct node {     long x,y,c; ...

  4. 洛谷1303 A*B Problem 解题报告

    洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...

  5. 洛谷 P2317 [HNOI2005]星际贸易 解题报告

    P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...

  6. 洛谷 P3802 小魔女帕琪 解题报告

    P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...

  7. 洛谷 P2606 [ZJOI2010]排列计数 解题报告

    P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...

  8. 洛谷 P1879 [USACO06NOV]玉米田 解题报告

    P1879 [USACO06NOV]玉米田Corn Fields 题目描述 农场主\(John\)新买了一块长方形的新牧场,这块牧场被划分成\(M\)行\(N\)列\((1 ≤ M ≤ 12; 1 ≤ ...

  9. 洛谷 P3084 [USACO13OPEN]照片Photo 解题报告

    [USACO13OPEN]照片Photo 题目描述 农夫约翰决定给站在一条线上的\(N(1 \le N \le 200,000)\)头奶牛制作一张全家福照片,\(N\)头奶牛编号\(1\)到\(N\) ...

随机推荐

  1. 算法相关——Java排序算法之快速排序(三)

    0. 前言 本系列文章将介绍一些常用的排序算法.排序是一个非常常见的应用场景,也是开发岗位面试必问的一道面试题,有人说,如果一个企业招聘开发人员的题目中没有排序算法题,那说明这个企业不是一个" ...

  2. 2018 Multi-University Training Contest 1 部分简单题解析

    Preface ACM系列赛第一站,没有进前200还是很伤的. 主要是T2当时没写出来就GG了,后来看了下其实不是很难. 题目按照比赛时我们A的顺序讲,其实我都是被陈潇然大佬和ZWC带飞的. T1 M ...

  3. 《Head First 设计模式》例子的C++实现(1 策略模式)

    最近在学习设计模式,用的是 <Head First 设计模式>这本书.感觉这本书写的还是很不错的,深入浅出的介绍了各种常用的设计模式.唯一有点不方便的地方是这本书的例子全都是用的 Java ...

  4. Caffe源码中caffe.proto文件分析

    Caffe源码(caffe version:09868ac , date: 2015.08.15)中有一些重要文件,这里介绍下caffe.proto文件. 在src/caffe/proto目录下有一个 ...

  5. Nancy异步用法

    个人笔记,记录Nancy异步用法 基类,所有请求都将首先执行该类,并执行Before事件 namespace CxyAdvert.Base { public class BaseNancyModel ...

  6. NTP服务部署和测试

    1. 概述2. 部署3. 配置4. 客户端配置4.1 客户端安装ntpdate4.2 同步设置 1. 概述 本篇博客主要记录如何部署一台NTP服务器,用于内网时间同步. 时间服务器对于集群内部节点之间 ...

  7. RuntimeError: Python is not installed as a framework 错误解决方案

    在virtualenv环境下使用matplotlib绘图时遇到了这样的问题: >>> import matplotlib.pyplot as pltTraceback (most r ...

  8. phpstorm 报错及解决

    1. 当项目里有大量 js 文件时,一旦编辑包含 js 的文件,phpstorm 会卡顿,甚至未响应 问题原因: 内存限制较小 解决方法一: 直接将弹出框中的红色部分修改为需要的内存限制,并选择 Sh ...

  9. nginx负载均衡(5种方式)、rewrite重写规则及多server反代配置梳理

    Nginx除了可以用作web服务器外,他还可以用来做高性能的反向代理服务器,它能提供稳定高效的负载均衡解决方案.nginx可以用轮询.IP哈希.URL哈希等方式调度后端服务器,同时也能提供健康检查功能 ...

  10. 领跑衫获奖感言 & 课程总结

    很荣幸在最后一次课获得了黄色领跑衫.在此,我要感谢教师杨贵福,感谢<构建之法>的作者邹欣老师和出版人周筠老师,感谢“耐撕”团队的队员们. 作为旁听生,最后一堂课,有些不舍.不多说,先上图, ...