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

#include<bits/stdc++.h>
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<<i<<" "<<j<<" "<<dx<<" "<<dy<<endl;
                        }}}}}cout << cnt - Dinic() << endl;return 0;
}

View Code

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

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

  1. 洛谷:P2172 [国家集训队]部落战争

    题目链接: P2172 [国家集训队]部落战争 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 解题思路: 很明显的二分图:将原点与它能走到的点连一条边,然后做一遍最小点覆盖:即选出 ...

  2. [国家集训队] 部落战争

    题目链接:戳我 差不多就是DAG最小路径覆盖吧--拆点连边. 不会的可以看看蒟蒻的这个关于网络流的小总结qwq 最小路径覆盖(不相交)=节点个数-最大匹配 但是要注意的是这个题的节点个数不能算高山深涧 ...

  3. [国家集训队]部落战争

    题目大意:给出n*m的矩阵以及r,c.求最小路径覆盖. 本来是匈牙利算法裸题,网络流也可以跑一跑. 但是我先粘一个骗分大错解: #include<cstdio> #include<c ...

  4. 51nod_2929 部落战争(DAG最小路径覆盖)

    部落战争 Problem Description lanzerb的部落在A国的上部,他们不满天寒地冻的环境,于是准备向A国的下部征战来获得更大的领土. A国是一个M*N的矩阵,其中某些地方是城镇,某些 ...

  5. bzoj 2150: 部落战争 (最小路径覆盖)

    2150: 部落战争 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 879  Solved: 493 [Submit][Status][Discus ...

  6. BZOJ 2039: [2009国家集训队]employ人员雇佣 最小割 二元组建图模型

    2039: [2009国家集训队]employ人员雇佣 Time Limit: 20 Sec  Memory Limit: 259 MB Submit: 1614  Solved: 789 [Subm ...

  7. bzoj2150 部落战争 二分图匹配

    题目链接:戳这里 2150: 部落战争 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 1141  Solved: 631 [Submit][Stat ...

  8. [bzoj2150] 部落战争 二分图

    2150: 部落战争 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 951 Solved: 533 [Submit][Status][Discuss] ...

  9. [BZOJ2150]部落战争-二分图匹配

    部落战争 Description lanzerb的部落在A国的上部,他们不满天寒地冻的环境,于是准备向A国的下部征战来获得更大的领土. A国是一个MN的矩阵,其中某些地方是城镇,某些地方是高山深涧无人 ...

最新文章

  1. Maven中mirrors和repository的关系
  2. mvc3 RenderAction传参问题
  3. PLSQL常用方法汇总(转载)
  4. Python3 高级特性
  5. 人力资源数字化的入口——组织生产力数字模型
  6. CentOS6.8 安装node.js npm
  7. CoreData 从入门到精通(五)CoreData 和 TableView 结合
  8. CCF202006-1 线性分类器
  9. 2018年10月底新公司
  10. unity3d点击屏幕判断是否击中场景中物体
  11. Unix/Linux操作系统介绍
  12. IEEE MAC地址分配
  13. 2.郝斌C语言笔记——优缺点
  14. matlab语音信号处理/滤波器降噪/时域频域、归一化图谱
  15. 互联网金融学习总结(5)——市场主流的风控模型简要学习总结
  16. 操作系统 设备基本概念和分类
  17. vscode运行命令是报错:标记“”不是此版本中的有效语句分隔符。
  18. 如何在Word中创建和打印标签
  19. 面试中常问的你在项目开发中遇到过哪些问题怎么回答?
  20. 解密dlink固件(四)

热门文章

  1. JVM中可生成的最大Thread数量
  2. 正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码......
  3. gis中的加权求和工具在哪里_ArcGIS教程:加权总和的工作原理
  4. android studio 自动提示jni代码,如何将JNI(C/C++本机代码)添加到现有的Android Studio项目中...
  5. python 检验数据正态分布程度_python 实现检验33品种数据是否是正态分布
  6. python 特征选择卡方_特征选择
  7. mysql的判断更新_mysql判断记录是否存在,存在则更新,不存在则插入
  8. 一键部署dns服务_OpenShift : 通往云原生、DevOps、微服务和Serverless的大门
  9. 计算机cg专业,cg行业要学哪个专业好
  10. python label textvariable_在子窗口中为标签的textvariable赋值失败时,有关,给,Label,问题...