随笔分类 - 板子
摘要:时间复杂度为Θ(n^3) const int inf =0x3f3f3f3f; const int N=505; long long w[N][N]; long long la[N],lb[N]; bool va[N],vb[N]; long long match[N]; long long n,m
阅读全文
摘要:#define LL long long #define N 10010 #define M 200010 using namespace std; int n,m,S,T; //n,m,s,t,分别表示点的个数、有向边的个数、源点序号、汇点序号 struct edge{LL v,c,ne;}e[M
阅读全文
摘要:二分图最大匹配可以转换成网络流模型。 将源点连上左边所有点,右边所有点连上汇点,容量皆为1。原来的每条边从左往右连边,容量也皆为1,最大流即最大匹配。 如果使用 Dinic 算法 求该网络的最大流,可在O(sqrt(n) * m)求出。 #define N 1010 #define M 200001
阅读全文
摘要:scc:极大的强连通子图(两两相互可达) const int N=10010; int n,m,a,b; vector<int> e[N]; int dfn[N],low[N],tot; int stk[N],instk[N],top; int scc[N],siz[N],cnt; void tar
阅读全文
摘要:单测试点有多组测试数据,注意fill手动清空 int e[M],ne[M],w[M],h[N],idx; int d[N],cnt[N],vis[N]; //为了卡常用spfa的时候就用链式前向星 void init(){ fill(h,h+n+1,-1);idx=0; } void add(int
阅读全文
摘要:染色法判别二分图 —— 模板题 AcWing 860. 染色法判定二分图 时间复杂度是 \(O(n+m)\), \(n\) 表示点数,\(m\) 表示边数 bool dfs(int u,int c){//判断存在奇环,存在返回true color[u]=c; for(auto v:e[u]){ if
阅读全文
摘要:假设 \(n\) 表示图中点数,\(m\) 表示图中边数。 Prim算法堆优化 时间复杂度 \(O(nlogn)\)。 核心思想:每次挑一条与当前集合相连的最短边。 code int ans,cnt; struct edge{int v,w;}; vector<edge> e[N]; int d[N
阅读全文
摘要:const int N = 100010; int n,m,a,b; vector<int> e[N], tp; int din[N];//入度数组 bool toposort(){ queue<int> q; for(int i = 1; i <= n; i++) if(din[i]==0) q.
阅读全文
摘要:单源最短路: 求一个点到其他点的最短路 多源最短路: 求任意两个点的最短路 稠密图用邻接矩阵存,稀疏图用邻接表存储。 稠密图: m 和 n2 一个级别 稀疏图: m 和 n 一个级别 朴素dij: int n,m,s,a,b,c; const int N=100010; struct edge{in
阅读全文
摘要:请你在树中找到一个点,使得该点到树中其他结点的最远距离最近。这个点被称为树的中心。 题解:https://www.cnblogs.com/dx123/p/17302104.html 评测:https://www.acwing.com/problem/content/1075/ 暴力做法是以每个点为根
阅读全文
摘要:树上任意两节点之间最长的简单路径即为树的「直径」。 树形 DP的做法 可以在存在负权边的情况下求解出树的直径。 const int N=10010,M=20010; int n,a,b,c,ans; struct edge{int v,w;}; vector<edge> e[N]; int dfs(
阅读全文
摘要:const int N=100010; int n, a, b; vector<int> e[N];//用vector作邻接表 int siz[N], pos, ans=1e9; void dfs(int x, int fa){ siz[x]=1; int mx=0; for(auto y : e[
阅读全文
摘要:https://www.luogu.com.cn/problem/P4316 本题暂时只写了用期望dp经典套路,套上期望DP的基本套路,设dp(u)为到达u点的期望长度。 期望dp,也叫概率dp 一般来说,期望dp找到正确的状态后,转移是比较容易想到的。 但一般情况下,状态一定是“可数”的 事实上,
阅读全文
摘要:void floyd() { for (int k = 1; k <= n; k ++ ) for (int i = 1; i <= n; i ++ ) for (int j = 1; j <= n; j ++ ) d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
阅读全文
摘要:struct DSU { vector<int> f, siz; DSU() {} DSU(int n) { init(n); } void init(int n) { f.resize(n); std::iota(f.begin(), f.end(), 0); siz.assign(n, 1);
阅读全文

浙公网安备 33010602011771号