题目链接 一个很暴力的想法:每个点拆点,向不能同时存在的连边 但是这样边太多了,而且会有很多重复.我不会说我还写了还没过样例 我们实际就是在做一个最大匹配.考虑原图,同在黄/红格里的骑士是互不攻击的,即不会连边. 那么拿这两部分建二分图,分别连向S,T.障碍直接不参与连边.这样边数也少 也直观好写. 原问题尽可能保留多等价于尽可能移走少.求最小割即可. #include <cstdio> #include <cctype> #include <algorithm> #d…
传送门 de了两个小时的bug愣是没发现错在哪里……没办法只好重打了一遍竟然1A……我有点想从这里跳下去了…… 和方格取数问题差不多,把格子按行数和列数之和的奇偶性分为黑的和白的,可以发现某种颜色一定只能走到另一种颜色.那么考虑对所有为奇的黑点,偶的为白点,源点对所有黑点连边,所有白点对汇点连边,容量都为$1$,然后黑点对所有能走到的白点连边,容量为$inf$,那么不难发现,要满足条件就要求出一组割,而因为答案是全部的减去割,所以只要求出最小割即可 //minamoto #include<ios…
题目描述 在一个 n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些方格设置了障碍,骑士不得进入 对于给定的 n*n 个方格的国际象棋棋盘和障碍标志,计算棋盘上最多可以放置多少个骑士,使得它们彼此互不攻击 输入输出格式 输入格式: 第一行有 2 个正整数n 和 m (1<=n<=200, 0<=m<n2),分别表示棋盘的大小和障碍数.接下来的 m 行给出障碍的位置.每行 2 个正整数,表示障碍的方格坐标. 输出格式: 将计算出的共存骑士数输出 输入输出样…
题意:nxn的棋盘 有m个坏点 求能在棋盘上放多少个马不会互相攻击 题解:这个题仔细想想居然和方格取数是一样的!!! 每个马他能攻击到的地方的坐标 (x+y)奇偶性不一样 于是就黑白染色 s->黑 白->t 按条件连黑->白 跑最小割 = 最大流 感性理解一下 就是先把所有的点都放上 得到最大的收益 然后删掉一些点使得合法 删掉一个黑点 减去黑点的收益 和黑点相连的白点受到的束缚就减少了 如果s和t点能联通的话 表示还有黑点和白点连通 问题就转化为了最小割 #include <bi…
传送门 这题让我联想到一道叫做方格取数问题的题,如果想使摆的更多,就要使不能摆的更少,因此根据骑士的限制条件建图,求出至少有多少骑士不能摆,减一减就行了. 代码: #include<bits/stdc++.h> using namespace std; int n,m,tot=0,d[500005],dx[8]={1,1,-1,-1,2,2,-2,-2},dy[8]={2,-2,2,-2,1,-1,1,-1},s,t,cnt=-1,first[500005],tim[205][205]; bo…
同方格取数问题:https://www.cnblogs.com/lokiii/p/8430720.html 记得把障碍点去掉,不连边也不计入sum #include<iostream> #include<cstdio> #include<queue> #include<cstring> using namespace std; const int N=100005,inf=1e9,dx[]={-2,-1,1,2,2,1,-1,-2},dy[]={-1,-2,…
二分图求最大独立点集 本问题在二分图中已处理过,此处用dinic写了一遍 #include <iostream> #include <cstdio> #include <algorithm> #include <cstdlib> #include <queue> #include <cstring> using namespace std; const int MAXN=40005,MAXM=5000005; int s,t,head…
Code: #include<cstdio> #include<cstring> #include<queue> #include<vector> #include<algorithm> using namespace std; const int maxn=800004; const int INF=10000000; int A[205][205],B[205][205]; int dy[]={-1,-2,-2,-1,1,2,2,1}; in…
题目大意:给出一张n个点m条边的无向图,每个点有点权,q次询问,每次给出k,要求选出若干个点点权之和不小于k,求一个最大的值x,使得选出的点中任意两点之间至少有x条互不相交的链.(n<=550,m<=3000,q<=2017) 当时看到这题一看就不可做 看了题解说什么等价流树也看不懂 后来FallDream大佬做了一题最小割树 看了看网上大神极短的说明加上自己大量的脑补终于搞懂了这玩意儿 另外貌似等价流树就是最小割树 最小割树的思路大概是先任意求出两点之间的最小割,并把整张图按最小割分成…
题解 Dinic求最小割 题目其实就是求最小的代价使得每个纵轴被分成两部分 最小割!!! 我们把每个点抽象成一条边,一个纵轴就是一条\(S-T\)的路径 但是题目要求\(|f(x,y)-f(x',y')| ≤D\) 不能直接跑最小割 考虑如何限制 首先,\(|f(x,y)-f(x',y')| ≤D\)是相互的 所以只要考虑 \(f(x,y)-f(x',y')\leq D\) 限制想一想看代码就明白了 代码就很简洁了 Code #include<bits/stdc++.h> #define LL…