题面 传送门 题解 调了咱一个上午-- 首先考虑二分答案,那么每个点能够到达的范围是一个圆,这个圆与目标圆的交就是可行的区间,这个区间可以用极角来表示 首先,如果我们知道这个正\(n\)边形的转角,也就是它在水平的基础上转过了几度的话,那么可以把它的每个顶点和包含它的圆弧所代表的点连边,如果这个二分图存在完备匹配那么说明有解 然而我们并不知道这个多边形转过了几度 我们考虑一种可行的方案,如果它没有任何一个顶点和在一段圆弧的端点上,那么一定可以转一点点距离使其中一个顶点刚好落在一个圆弧的端点上,那…
洛谷P4014 分配问题[最小/大费用流]题解+AC代码 题目描述 有 n 件工作要分配给 n 个人做.第 i 个人做第 j 件工作产生的效益为c ij. 试设计一个将 n 件工作分配给 n 个人做的分配方案,使产生的总效益最大. 输入格式: 文件的第 1 行有 1 个正整数 n,表示有 n 件工作要分配给 n 个人做.接下来的 n 行中,每行有 n 个整数c ij,表示第 i 个人做第 j 件工作产生的效益为c ij . 输出格式: 两行分别输出最小总效益和最大总效益. 输入样例 5 2 2…
题目链接 洛谷P4559 题解 只会做\(70\)分的\(O(nlog^2n)\) 如果本来就在区间内的人是不用动的,区间右边的人往区间最右的那些空位跑,区间左边的人往区间最左的那些空位跑 找到这些空位就用二分 + 主席树 理应可以在主席树上的区间二分而做到\(O(nlogn)\),但是写不出来,先留着坑 #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #in…
洛谷 P4016负载平衡问题 P4014 分配问题[费用流]题解+AC代码 负载平衡问题 题目描述 GG 公司有n个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运. 输入格式: 文件的第 11 行中有 11 个正整数 n,表示有 n 个仓库. 第 22 行中有 n 个正整数,表示 n 个仓库的库存量. 输出格式: 输出最少搬运量. 输入样例 5 17 9 14 16 4 输出样例 11 说明 1001…
题目链接:https://www.luogu.org/problemnew/show/P4012 洛谷 P4012 深海机器人问题 输入输出样例 输入样例#1: 1 1 2 2 1 2 3 4 5 6 7 2 8 10 9 3 2 0 0 2 2 2 输出样例#1: 42 说明 题解:建图方法如下: 对于矩阵中的每个点,向东.向北分别与其相邻点都要连两条边(重边): 1)容量为1,费用为该边价值的边: 2)容量为INF,费用为0的边(因为多个深海机器人可以在同一时间占据同一位置). 对于每个起点…
传送门 洛谷 Solution 考虑把每一个修车工人拆成\(n\)个点,那么考虑令\(id(i,j)\)为第\(i\)个工人倒数第\(j\)次修车. 然后就可以直接跑费用流了!!! 代码实现 /* mail: mleautomaton@foxmail.com author: MLEAutoMaton This Code is made by MLEAutoMaton */ #include<stdio.h> #include<stdlib.h> #include<string…
大家可以先看这道题目再做! SCOI2007修车 传送门 洛谷 Solution 就和上面那道题目一样的套路,但是发现你会获得60~80分的好成绩!!! 考虑优化,因为是SPFA,所以每一次只会走最短路,做完之后发现... 欸,好像每一次会搞掉一条边,那么我们动态加入点就好了. 代码实现 /* mail: mleautomaton@foxmail.com author: MLEAutoMaton This Code is made by MLEAutoMaton */ #include<stdi…
这篇博客写得非常好呀. 传送门 于是我是DCOI这一届第一个网络流写ISAP的人了,之后不用再被YKK她们嘲笑我用Dinic了!就是这样! 感觉ISAP是会比Dinic快,只分一次层,然后不能增广了再更新dis,再加上杂七杂八的优化,但是写起来要比Dinic稍微复杂一点点. 洛谷的模板比我改过后的Dinic又快了两倍多. #include<cstdio> #include<cstring> #include<iostream> #include<algorithm…
题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M条道路连接.每只河蟹可以对一个点进行封锁,当某个点被封锁后,与这个点相连的道路就被封锁了,曹就无法在与这些道路上刷街了.非常悲剧的一点是,河蟹是一种不和谐的生物,当两只河蟹封锁了相邻的两个点时,他们会发生冲突. 询问:最少需要多少只河蟹,可以封锁所有道路并且不发生冲突. 输入输出格式 输入格式: 第…
题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每行两个正整数u,v,表示u,v有一条连边 输出格式: 共一行,二分图最大匹配 输入输出样例 输入样例#1: 1 1 1 1 1 输出样例#1: 1 说明 n,m<=1000,1<=u<=n,1<=v<=m 因为数据有坑,可能会遇到v>m的情况.请把v>m的数据自觉过滤掉. 算法:二分图匹配 ++++++++…
我到底怎么建的图为啥要开这么大的数组啊?! 神题神题,本来以为图论出不出什么花来了. 首先要理解'团'的概念,简单来说就是无向图的一个完全子图,相关概念详见度娘. 所以关于团一般都是NP问题,只有二分图例外.而题目中有这样一句话"n座城市可以恰好被划分为不超过两个城市群",并且给出的是没有的边,也就是这个图的补图,两个团就很显然表示这个补图是个二分图(我一开始还考虑1个团咋整后来发现根本不用整= =),模型就变成了二分图的最大独立集,考虑最大独立集=n-最大匹配,那么只要求出删掉哪些边…
P3386 [模板]二分图匹配(复习) 题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每行两个正整数u,v,表示u,v有一条连边 输出格式: 共一行,二分图最大匹配 输入输出样例 输入样例#1: 1 1 1 1 1 输出样例#1: 1 说明 n,m \leq 1000n,m≤1000, 1 \leq u \leq n1≤u≤n, 1 \leq v \leq m1≤v≤m 因为数据有坑,…
P1330 封锁阳光大学 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M条道路连接.每只河蟹可以对一个点进行封锁,当某个点被封锁后,与这个点相连的道路就被封锁了,曹就无法在与这些道路上刷街了.非常悲剧的一点是,河蟹是一种不和谐的生物,当两只河蟹封锁了相邻的两个点时,他们会发生冲突. 询问:最少需要多少只河蟹,可以封锁所有道路并且不发生冲突. 输…
题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每行两个正整数u,v,表示u,v有一条连边 输出格式: 共一行,二分图最大匹配 输入输出样例 输入样例#1: 复制 1 1 1 1 1 输出样例#1: 复制 1 说明 n,m \leq 1000n,m≤1000, 1 \leq u \leq n1≤u≤n, 1 \leq v \leq m1≤v≤m 因为数据有坑,可能会遇到 v>mv>m …
匈牙利算法模板 /*by SilverN*/ #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<vector> using namespace std; ; int read(){ ,f=;char ch=getchar(); ;ch=getchar();} +ch-';ch=getcha…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5006 https://www.luogu.org/problemnew/show/P4547 算一种可行方案,只要确定出 n 条边即可:概率就是这 n 条边存在的概率,其他边视作无要求,概率贡献都是1:这样的话,一种方案对答案的贡献就是其概率. 考虑把第二组边和第三组边分成概率分别为 1/2 的两条独立的边.对于第二组边再加一条能把4个点都连起来的 1/4 的边,对于第三组边再加一条能把4…
题面 传送门 题解 翻译一下题意就是每次选出一些点,要用最少的边把这些点连起来,求期望边数 我也不知道为什么反正总之就是暴力枚举太麻烦了所以我们考虑贡献 如果一条边是割边,那么它会在图里当且仅当两边的联通块中都有点被选,设其中一边的点的个数为\(siz\),那么方案数就是\((2^{siz}-1)(2^{n-siz}-1)\) 然而如果一条边是环边就会变得非常麻烦了--每种方案相当于这个环上有若干个点被标记,要用最少的边数将它们连起来,那么边数就是环的大小减去\(\max(\)两个相邻点之间的边…
题面 传送门 题解 看出这是个闵可夫斯基和了然而我当初因为见到这词汇是在\(shadowice\)巨巨的\(Ynoi\)题解里所以压根没敢学-- 首先您需要知道这个 首先如果有一个向量\(w\)使得\(w+b=a\),也就是使\(A,B\)的凸包有交,有\(w=a-b\),那么我们把\(B\)的横坐标和纵坐标全部取反之后,\(w\)就必定在\(A\)和\(-B\)的闵可夫斯基和里 那么只要对\(A,-B\)求一个闵可夫斯基和的凸包就行了,然后判一下输入的向量是否在这个凸包里就行了 //minam…
题面 传送门 题解 首先考虑一个贪心,我们把所有的人按\(a_i\)排个序,那么排序后的第一个人到\(k\),第二个人到\(k+1\),...,第\(i\)个人到\(k+i-1\),易证这样一定是最优的 然后发现这里有一个很重要的性质,\(a_i\)互不相同.那么就必定存在一个点\(mid\),在\(mid\)左边(包括\(mid\))的空格子和人一样多,右边(不包括\(mid\))也一样多 那么很明显,\(mid\)左边的所有人都需要往右跑,\(mid\)右边的所有人都需要往左跑 然后来康康答…
题目:https://www.luogu.org/problemnew/show/P4547 https://www.lydsy.com/JudgeOnline/problem.php?id=5006 参考博客:https://www.cnblogs.com/yanshannan/p/9452802.html 注意同一个点连出去的两条边本来就不能一起选! 每次调用 map 会很慢!所以修改的时候新定义一个 &tmp,就能过了. 代码如下: #include<cstdio> #inclu…
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!\)种完美匹配的各自的出现概率之和再乘上\(2^n\)的值. 发现\(n\)很小,考虑状压\(DP\).设\(f_{S,T}\)为左部图匹配情况为\(S\),右部图匹配情况为\(T\)的期望,可以得到转移为: \[ f_{S,T}=\sum_{x \subseteqq S \land y \subseteqq T }f_{S \oplus x,T \oplus y} \times p_e \] 其中\(x,y\)为边\(e\)的在两个部图的两个端点,\(p_…
题面传送门 一眼树形 \(dp\) 本题有 \(2\) 大难点. 难点之一是状态的设计,这里需要四维状态,\(dp[i][j][0/1][0/1]\) 表示在以 \(i\) 为根的子树内放了 \(j\) 个监听器,\(i\) 号点是否放了监听器,\(i\) 号点是否被它的儿子覆盖,在这种情况下的方案数. 设计好了状态,转移也就水到渠成了. \(dp[u][j][0][0]\) 只能从 \(dp[v][j][0][1]\) 转移:\(i\) 号节点没放监听设备也没被覆盖,说明它的儿子都没放监听设备…
原题链接 这题貌似比较水吧,最简单的拆点,直接上代码了. #include <bits/stdc++.h> using namespace std; #define N 1000 #define M 5000 #define INF 0x3f3f3f3f #define mp make_pair #define pii pair<int, int> #define pb push_back int n, m, K, S, T; int d[2*N+5], vis[2*N+5], a…
题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行包含三个正整数ui.vi.wi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi) 输出格式: 一行,包含一个正整数,即为该网络的最大流. 输入输出样例 输入样例#1: 4 5 4 3 4 2 30 4 3 20 2 3 20 2 1 30 1 3 40 输出样例#1: 50…
题意 题目链接 Sol 这题能想到费用流就不难做了 从S向(1, 1)连费用为0,流量为K的边 从(n, n)向T连费用为0,流量为K的边 对于每个点我们可以拆点限流,同时为了保证每个点只被经过一次,需要拆点. 对于拆出来的每个点,在其中连两条边,一条为费用为点权,流量为1,另一条费用为0,流量为INF 相邻两个点之间连费用为0,流量为INF的边. 跑最大费用最大流即可 #include<bits/stdc++.h> #define Pair pair<int, int> #def…
题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行包含三个正整数ui.vi.wi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi) 输出格式: 一行,包含一个正整数,即为该网络的最大流. 输入输出样例 输入样例#1: 4 5 4 3 4 2 30 4 3 20 2 3 20 2 1 30 1 3 40 输出样例#1: 50…
题目链接 首先是可以\(O(n^2)\)枚举出所有符合要求的点对的,然后考虑建图. 还是拆点把每个点拆成入点和出点,源点连入点,出点连汇点,流量都是1,费用都是0. 然后对于没对符合要求的\((x,y)\),连接\((x_{in},y_{out}),(y_{in},x_{out})\),费用均为\(x+y\),流量均为\(1\). 然后跑出最大费用最大流,最大流除以2就是第一问,最大费用除以2就是第二问. 为什么要双向连边然后答案除以2?单向连边去试试就知道了 PS:会重复. #include…
题目链接 简单网络流. 源点向蜥蜴连流量为\(1\)的边. 能跳出去的点向汇点连流量为\(INF\)的边. 把每个点拆成\(2\)个点,\(O(n^4)\)枚举两两点,如果距离小于等于\(d\),就互连流量为\(INF\)的边. 然后跑\(dinic\)就行了. #include <cstdio> #include <queue> #include <cmath> #include <cstring> #define INF 2147483647 using…
题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行包含三个正整数ui.vi.wi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi) 输出格式: 一行,包含一个正整数,即为该网络的最大流. 输入输出样例 输入样例#1: 复制 4 5 4 3 4 2 30 4 3 20 2 3 20 2 1 30 1 3 40 输出样例#1: …