3171: [Tjoi2013]循环格
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 1155 Solved: 730
[Submit][Status][Discuss]
Description
一个循环格就是一个矩阵,其中所有元素为箭头,指向相邻四个格子。每个元素有一个坐标(行,列),其中左上角元素坐标为(0,0)。给定一个起始位置(r,c)
,你可以沿着箭头防线在格子间行走。即如果(r,c)是一个左箭头,那么走到(r,c-1);如果是右箭头那么走到(r,c+1);如果是上箭头那么走到(r-1,c);如果是下箭头那么走到(r+1,c);每一行和每一列都是循环的,即如果走出边界,你会出现在另一侧。
一个完美的循环格是这样定义的:对于任意一个起始位置,你都可以i沿着箭头最终回到起始位置。如果一个循环格不满足完美,你可以随意修改任意一个元素的箭头直到完美。给定一个循环格,你需要计算最少需要修改多少个元素使其完美。
第一行两个整数R,C。表示行和列,接下来R行,每行C个字符LRUD,表示左右上下。
Output
一个整数,表示最少需要修改多少个元素使得给定的循环格完美
3 4
RRRD
URLL
LRRR
Sample Output
2
HINT
1<=R,L<=15
题解
结论,n个点的有向图,只能连n条边,每个点都在回路内,当且仅当所有点出度入度都为1。
先证充分, n条边,能够提供n个入度,n个出度,如果一个点入度大于1, 那么存在点的入度为0,走不出去,不能成回路。所以一个点入度必须为1。出度同理。
再证必要,所有点出度入度都为1,所以只有一条路径可走。从一个点开始走,由于点数有限,若回不来,一定在某个地方走成了回路,那么入口处的点就会有两个入度,矛盾。
一个点拆为两个,左边为出度点,右边为入度点。
每个点改方向费用为1,不改费用为0.
问题转化为二分图最小权完美匹配。
#include #include #include #include #include #include