问题:给你一幅网络图,每条边上有最大流量限制,问从源点s到汇点t的最大流量.
FF算法
Ford_Fulkerson算法(FF算法)就是基于这两个做的,不停的利用反向弧寻找增广路,复杂度$O(F\times E)$,F为最大流的流量,因为最坏情况下每次最大流量增加1,每次dfs寻找增广路复杂度为$O(E)$.
Dinic算法
算法由bfs求层次图,dfs求增广路组成.
引入层次图是防止盲目搜索,只做一次dfs,就求出这次层次图的所有增广路.
复杂度为$O(V^2 \times E)$
参考:
给你一个真分数,问它最少能拆成几个单位分数的和,如果有多组解,选择最小分数最大的那组.
19/45=1/3 + 1/12 + 1/180
19/45=1/3 + 1/15 + 1/45
19/45=1/3 + 1/18 + 1/30,
19/45=1/4 + 1/6 + 1/180
19/45=1/5 + 1/6 + 1/18
所以最后答案为5,6,18.
早就听说了IDA*,一直没学.
这个算是第一道IDA*题.
IDA*给我的感觉就是每次限制了搜索层数的dfs,先搜索第i层,如果没有解,那么就继续搜索第i+1层,这样一直做下去.这个的感觉有点像bfs,但是它省空间啊.
随着深度增加,搜索空间的大小指数增加,IDA*在递归深度限制的过程中虽然重复搜索了很多状态,但总的访问状态数和最后一次所访问的状态数还是同一数量级的.
IDA*适用于搜索树很大,但答案所在深度不深的题目
大体框架就是:
1 | int res=0; |
我们让分母值单调增加,对于这个题的一个减枝就是,如果使用cnt个单位分数让他们的值$\ge \frac{a}{b}$,那么 $\frac{cnt}{x} \geq \frac{a}{b}$
那么$x \leq \frac{cnt\times b}{a}$
1 |
|
在连通分量这一节中,主要包括:
无向图的割点和点双连通分量,桥和边双连通分量,有向图的强连通分量
其中,主要利用到的是两个数组:
low[u]:u以及他的后代所能回到的最小的dfn值.
dfn[u]:u点的访问时间.
割点定义: 如果删除一个点后,连通块数量增加,该点为割点.
判定条件: 如果一个点为割点,需要满足low[u]$\geq$dfn[v],而如果u为根节点需要满足他的儿子需要$child\geq$2.
代码: 割点
点双连通分量定义: 子图中任意两个点之间至少存在两条”点不重复“的路径.
判定条件:没写过
代码:没写过
桥的定义: 如果删除一条边后,连通块数量增加,该边为割边.
判定条件: v的后代只能连回v自己,既 $low[v]>dfn[u]$. 桥特别要注意重边,为了去重边,我们传边的编号.
代码: 桥
边双连通分量定义: 子图中任意两点之间至少存在两条”边不重复“的路径.
求解方法: 一个图中,把所有的桥去掉,每个连通分量对应着原图中的一个边双连通分量.
代码: 加最少的边,让整个图变成边双连通
hint
强连通分量的定义: 一个强连通分量内,任意两个点之间互相可达.
判定条件: 如果$low[u]==dfn[u]$,那么u点为该强连通分量的”根”
代码: 加最少的边让有向图强连通 注意特判连通分量为1的情况
hint
给出个加工任务的开始时间和结束时间,问最少要用多少台机器可以完成这些任务,同一台机器上的任务时间不能有重叠,但允许守尾相接。对于每组用例,输出两个整数,分别表示最少用的机器台数和所有机器用的总时间。一台机器的用时为它最后的结束时间减它最开始启动的时间,中间不会停机。
$ T (1 <= T <= 100) , N (0 < N <= 100000,0<=s_i<e_i<=1e9)$
Sample Input
1 | 1 |
Sample Output
1 | 2 8 |
这个题第一问是很简单,就是最大重叠数,用前缀和就可以解决了.对于第二个问,我们只需要考虑在哪些地方一定需要增加一台机器,把这个时间记录下来,一共记为$\sum first_i$,同理从后往前,可以算出$\sum last_i$,两个相减就可以了.
然后这个题的$s_i,t_i$都很大,所有我们需要离散化一下,采用 sort+unique+unordered_map的方法
最后但也是最重要的,数据规模很大,需要采用读入挂,T到怀疑人生,以后注意,如果超过1e6个数就采用读入挂
1 |
|