有一个 n ∗ m n*m n∗m的格子, 一个人起点 ( 1 , 1 ) (1,1) (1,1), 目的点是 ( n , m ) (n,m) (n,m)可以往右/往下走, #为不能走的点, 问做少把几个.改成#(不能改起点和终点)能让这个人不能走到.
当然最多改2个鸭
最小割就是最大流啊
网络流冲冲冲
把图里的每个格子拆成两个点, 其间的流量就是去掉这个点的代价(1), 当然第一个点和最后一个点代价是inf.
然后每个点的2号向其下/右的点的1号连边, 流量是inf.
然后从起点到终点跑网络流就行了.
注意这样n*m的图, 拆点可以学习ZGQ的函数:
int point1(int i, int j) {
return i * mm + j;
}
int point2(int i, int j) {
return i * mm + j + nn * mm;
}
真的强啊
注意自己的板子要初始化n.(当然不是图上的n啊!!)
代码:
#include<bits/stdc++.h>
#define FAST ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxN = 2200050;
const int maxM = 4200050;
namespace DINIC {
int n;// 这个n要记得初始化
int cnt;
int Head[maxN];
int Next[maxM << 1];
int W[maxM << 1];
int V[maxM << 1];
int Depth[maxN];
int cur[maxN];//cur就是记录当前点u循环到了哪一条边
int s, t;
void init2