随笔分类 - ACM-图论
摘要:网络流的最后一步。之前已经写了最大流的Dinic,SAP,EK这三种算法。 1 #include "stdafx.h" 2 #include <iostream> 3 #include <algorithm> 4 #include <queue> 5 #include <math.h> 6 #inc
阅读全文
摘要:1 //tarjian离线求LCA 2 #include<cstdio> 3 #define N 420000 4 struct hehe{ 5 int next; 6 int to; 7 int lca; 8 }; 9 hehe edge[N];//树的链表 10 hehe qedge[N];//
阅读全文
摘要:1 //求强联通分量 2 #include<bits/stdc++.h> 3 const int N=1e5+7; 4 const int M=1e5+7; 5 struct node{ 6 int v,next; 7 }e[M]; 8 int head[N],cnt; 9 int p[N],st[
阅读全文
摘要:最近发现struct板子真的好用。 1 #include<bits/stdc++.h> 2 #define ll long long 3 #define scan(i) scanf("%d",&i) 4 #define scand(i) scanf("%lf",&i) 5 #define scanl
阅读全文
摘要:1 #include<bits/stdc++.h> 2 #define ll long long 3 #define scan(i) scanf("%d",&i) 4 #define scand(i) scanf("%lf",&i) 5 #define scanl(i) scanf("%lld",&
阅读全文
摘要:给一个有向图,求最小树形图的权值。 用in存图,用pre记录前驱节点。 1 #include<iostream> 2 using namespace std; 3 #include<cstdio> 4 #include<cstring> 5 #define MAXN 1005 6 #define I
阅读全文
摘要:k叉赫夫曼树:每次合并k个权值最小的节点,用优先队列存,直到只剩下不到k个节点 首先判满,计算多余节点个数,是(N-1)mod(k-1)。然后有两种方法补满, ①:把(多余的+1)个合并成1个 ②:缺少的用0来补充 有人说用优先队列太慢,会被卡log方,于是可以考虑用数组存储被合并的点,被合并的点的
阅读全文
摘要:有个两百多行的板子,没有注释,看着好像挺对的,先挖个坑以后填。 1 #include <bits/stdc++.h> 2 #define N 810 3 using namespace std; 4 typedef long long ll; 5 inline int read() 6 { 7 in
阅读全文
摘要:俗称HK算法。和匈牙利算法一个功能,但是复杂度更优。匈牙利算法复杂度O(VE),HK算法复杂度O(sqrt(V)*E)。 但是很容易写崩,别问我怎么知道的。 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int MAXN=500;/
阅读全文
摘要:对于一个图G(V,E),它的匹配M是二元组(u,v)组成的集合,其中u,v∈V,(u,v)∈E,并且M中不存在重复的点。 当|M|最大的时候,我们称M为G的最大匹配。 当G是一个二分图的时候,它的最大匹配可以用经典的匈牙利算法或网络流算法求解。然而当G是一个一般的图时,直接进行增广就变得不可行了,这
阅读全文
摘要:二分图最大带权匹配。 输入点的个数和各边权值,输出最大匹配的权值和。 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 5 using namespace std; 6 7 const int N=310; 8 const i
阅读全文
摘要:网络流主要解决三种问题:最大流、最小流和费用流。 最大流算法主要有三种:EK算法、Dinic算法、SAP算法。 本篇博客是关于SAP算法的。最坏的情况下,SAP算法将达到复杂度O(VE2)。 1 #include <iostream> 2 #include <cstdio> 3 #include <
阅读全文
摘要:网络流主要解决三种问题:最大流、最小流和费用流。 最大流算法主要有三种:EK算法、Dinic算法、SAP算法。 本篇博客是关于Dinic算法的。最坏的情况下,Dinic算法将达到复杂度O(V2E)。 1 #include <iostream> 2 #include <cstdio> 3 #inclu
阅读全文
摘要:网络流主要解决三种问题:最大流、最小流和费用流。 最大流算法主要有三种:EK算法、Dinic算法、SAP算法 本篇博客是关于EK算法的。最坏的情况下,EK算法将达到复杂度O(VE2)。 1 #include <iostream> 2 #include <queue> 3 #include<strin
阅读全文
摘要:首先求出最小生成树,我们枚举每条不在最小生成树上的边,并把这条边放到最小生成树上面,然后就一定会形成环,那么我们在这条环路中取出一条最长的路(除了新加入的那一条边)。最终我们得到的权值就是次小生成树的权值。 prim算法实现: 我们在求解次小生成树的时候我们要使用一个二维数组maxd[i][j]表示
阅读全文
摘要:简单的纯板。prim算法适合稠密图,kruskal算法适合简单图。prim算法复杂度O(n^2),n是图中点的个数,kruskal算法复杂度O(eloge),e为图中边的条数。值得一提的是,加入堆优化的prim算法复杂度可达O(nloge)。 首先放一个很喜欢的kruskal。 1 #include
阅读全文
摘要:1 #include<bits/stdc++.h> 2 #define ll long long 3 #define scan(i) scanf("%d",&i) 4 #define scand(i) scanf("%lf",&i) 5 #define scanl(i) scanf("%lld",&
阅读全文
摘要:1 #include<bits/stdc++.h> 2 #define ll long long 3 #define scan(i) scanf("%d",&i) 4 #define scand(i) scanf("%lf",&i) 5 #define scanl(i) scanf("%lld",&
阅读全文