首页 > P2172 [国家集训队]部落战争 二分图最小不相交路径覆盖

P2172 [国家集训队]部落战争 二分图最小不相交路径覆盖

二分图最小不相交路径覆盖

#include
using namespace std;
const int MAXN = 5550;
const int MAXM = 1000005;
const int INF = 1000000050;
int Head[MAXN], cur[MAXN], lev[MAXN], to[MAXM << 1], nxt[MAXM << 1], f[MAXM << 1], ed = 1, S, T;
inline void addedge(int u, int v, int cap)
{to[++ed] = v;nxt[ed] = Head[u];Head[u] = ed;f[ed] = cap;to[++ed] = u;nxt[ed] = Head[v];Head[v] = ed;f[ed] = 0;return;
}
inline bool BFS()
{int u;memset(lev, -1, sizeof(lev));queue<int>q;lev[S] = 0;q.push(S);while (q.size()) {u = q.front();q.pop();for (int i = Head[u]; i; i = nxt[i])if (f[i] && lev[to[i]] == -1) {lev[to[i]] = lev[u] + 1;q.push(to[i]);/*if (to[i] == T){return 1;}magic one way optimize*/}}memcpy(cur, Head, sizeof Head);return lev[T] != -1;
}
inline int DFS(int u, int maxf)
{if (u == T || !maxf) {return maxf;}int cnt = 0;for (int &i = cur[u], tem; i; i = nxt[i])if (f[i] && lev[to[i]] == lev[u] + 1) {tem = DFS(to[i], min(maxf, f[i]));maxf -= tem;f[i] -= tem;f[i ^ 1] += tem;cnt += tem;if (!maxf) {break;}}if (!cnt) {lev[u] = -1;}return cnt;
}
int Dinic()
{int ans = 0;while (BFS()) {ans += DFS(S, 2147483647);}return ans;
}
void init(int SS, int TT)
{memset(Head, 0, sizeof(Head));ed = 1;S = SS;T = TT;return;
}
char ff[205][205];
int dir[5][2];
int aim[205][205];
int cnt = 0;
int main()
{int n, m;int r, c;int u, v;scanf("%d %d %d %d", &n, &m, &r, &c);dir[1][0] = dir[2][1] = r;dir[1][1] = dir[2][0] = c;dir[3][0] = c, dir[4][0] = r;dir[3][1] = -r, dir[4][1] = -c;if(r==c){dir[2][0]=dir[2][1]=dir[4][0]=dir[4][1]=50;}for (int i = 1; i <= n; i++) {scanf("%s", ff[i]+1);}for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {if (ff[i][j] == '.') {aim[i][j] = ++cnt;}}}S = 0, T = 2 * cnt + 1;for (int i = 1; i <= cnt; i++) {addedge(S, i, 1);addedge(cnt + i, T, 1);}for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++) {if (ff[i][j] == '.') {for (int k = 1; k <= 4; k++) {int dx = i + dir[k][0];int dy = j + dir[k][1];if (dx >= 1 && dx <= n && dy >= 1 && dy <= m) {if (ff[dx][dy] == '.') {u = aim[i][j], v = aim[dx][dy] + cnt;addedge(u, v, 1);//cout<
                        }}}}}cout << cnt - Dinic() << endl;return 0;
}
View Code

 

转载于:https://www.cnblogs.com/Aragaki/p/10694881.html

更多相关:

  •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

  • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

  • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

  • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...

  • 需求 有时候自媒体创作写稿时难免遇到大规模压缩某个文件夹内的图片的情况,通常我们可以使用一些批量压缩的工具来处理,但我觉得,这是小白的做法,对于我们这些经验丰富的老司机来说,使用代码来处理,将是一件高效而且高逼格的事情。使用PIL中的Image模块,就能很快地完成这项工作。 准备 我的电脑图片文件夹中有一个壁纸文件夹"win8壁...

  • ** debug:g2o cmake时报错“Qt5 not found. Install it and set Qt5_DIR accordingly” ** 完整报错: @ubuntu:~/WorkSpace/g2o/build$ cmake …/ – Compiling on Unix – Found CHOLMOD and...

  • 在python 中如果通过多线程的方式执行某个方法很简单,只需要把同步函数的第一个参数为该函数对象即可。但是如果函数对象是某个类的静态方法,这时候如果直接使用类的该函数对象会报错。此时需要构造一个代理的方法来实现。 如:上一个博文中的统计目录大小的静态类方法,如果想要查询多目录的空间大小,并且做成多线程个的方式。可采用下面的方法:...

  • 1 build_kernel() 2 { 3 # 进入源码顶层目录 4 cd ${BS_DIR_KERNEL} || return 1 5 # 编译配置文件 6 make ${BS_CONFIG_KERNEL} ARCH=arm CROSS_COMPILE=...

  • git rm -rf dirgit add .git commit -m 'remove dir'git push origin master //dir是要删除的文件夹路径 转载于:https://www.cnblogs.com/xulei1992/p/5650399.html...