图论
Aurora141592
这个作者很懒,什么都没留下…
展开
-
[图论]树上启发式合并
https://codeforces.com/contest/600/problem/E#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1e5 + 10, mod = 1e9 + 7; vector<int> g[maxn];int n,ma,a[maxn],cnt[maxn],fa[maxn],dep[maxn],sz[maxn],son[maxn],to原创 2021-01-14 12:38:02 · 124 阅读 · 0 评论 -
[图论]点分治
洛谷 – P4178 – Treehttps://www.luogu.org/problem/P4178给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于K#include<bits/stdc++.h>using namespace std;typedef long long ll;typedef pair<int, int> pii;const int maxn = 4e4 + 10, mod = 1e9 + 7, inf = 0x3f3f3原创 2021-01-14 12:37:05 · 113 阅读 · 0 评论 -
洛谷 – P3379 -【模板】最近公共祖先(树链剖分)
https://www.luogu.org/problem/P3379这次我是用树剖写的LCA,写的比倍增简单而且还快一点。树剖一般指的是重链剖分,首先把所有节点的子节点中最大的标出来,称为重子节点,从节点到重子节点的边叫重边,一段连续的重边称为重链,其他的轻子节点叫轻链,然后把整棵树dfs一下,dfs的时候优先dfs重儿子,这样可以保证同一条重链上的点时间戳连续。这样就把一棵树剖分成了很多条链,那么就可以用数据结构维护这些链,优化时间复杂度。如果询问两个点的LCA,先判断是不是在一条链上,如果不是那原创 2021-01-14 12:36:27 · 107 阅读 · 0 评论 -
[图论]分层图最短路
ABC132 – E – Hopscotch Addicthttps://atcoder.jp/contests/abc132/tasks/abc132_e分层图的思想很重要。这题算比较简单的,因为每次都要走三步,我们假设每次只走一步,那么每个点就有三种状态:起点(终点)、走一步到达的点、走两步到达的点,那么我们把图分成三层,每走一步相当于往下一层图走,只有每三步到达的点才是最终停下来的点,连边的时候就连到下一层对应的点,这个方法同时也能很好的处理环的情况,建完图bfs一下就好了。#include&原创 2021-01-14 12:30:57 · 128 阅读 · 0 评论 -
[图论]POJ – 1679 – The Unique MST(次小生成树)
我写了个暴力的算法,先求一遍最小生成树。然后枚举所有最小生成树的边依次删除,每次再计算一次最小生成树,取最小值,然后和一开始求的值比较。原理是次小生成树的边一定至少有一条和最小生成树的不一样。注意:删除一条边之后图可能不连通,不连通的图没有生成树,应该返回最大值。#include<stdio.h>#include<string.h>#include<algorithm>#define maxn 10005struct edge{ int u, v, c原创 2021-01-05 13:24:01 · 66 阅读 · 0 评论 -
[图论]最大权最短路径
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1459其实就是在路径相等的时候更新一下最大权就好了。#include<bits/stdc++.h>using namespace std;typedef pair<int, int> pii;struct edge{ int v, c;};vector<edge> g[505];int a[505], d[505], w[原创 2021-01-03 14:43:15 · 262 阅读 · 0 评论 -
[图论+ 数据结构]AC自动机(TLE版本)
自闭了啊,搞了一天总算把算法实现了,然而这个算法是TLE的,我的trie写法太垃圾了。#include<bits/stdc++.h>using namespace std;typedef long long ll;#define maxn 1000005int pstl, pstr, idc;struct node{ node() : c(0), cnt(0), id(++idc) {sub.clear();} char c; vector<node*&原创 2020-12-31 09:53:58 · 281 阅读 · 1 评论 -
洛谷 – 1030 – 推二叉树遍历(递归)
知中序后序求前序#include<bits/stdc++.h>using namespace std;string a, b;void pre(string a, string b){ int t = b.size() - 1; cout << b[t]; int p = a.find(b[t]); if (p > 0) pre(a.substr(0, p), b.substr(0, p)); if (p < t) pre原创 2020-12-30 13:05:32 · 138 阅读 · 0 评论 -
[图论]最小生成树
kruskal算法#include<bits/stdc++.h>#define maxn 10005struct edge{ int u, v, c;}g[maxn];int par[maxn];int find(int x){return par[x] < 0 ? x : par[x] = find(par[x]);}bool comp(edge a, edge b){return a.c < b.c;}int main(){ int n, m;原创 2020-12-30 12:59:48 · 148 阅读 · 0 评论 -
[图论]最短路径
如果边权都是1直接bfs求最短路即可。如果边权是1/0,那么就把0在队头插入即可,相当于跳过了这条边,时间复杂度O(m)。SPFA:就是把优先队列改成队列,然后while改成下面的就可以了,松弛操作和dijkstra一样,就是多了个used数组,SPFA可以处理有负权边的最短路。while(!qi.empty()){ int u = qi.front(); qi.pop(); used[u] = false; for (int i = 0; i < g[u].size();原创 2020-12-29 14:01:02 · 86 阅读 · 0 评论 -
final – 图论(网络流)
二分图有向图无向图貌似区别不大,以后写到了再试。独立集:独立集是指图 G 中两两互不相邻的顶点构成的集合点覆盖:对于图 G=(V,E) 中的一个点覆盖是一个集合S⊆V使得每一条边至少有一个端点在S中边覆盖:任意顶点都至少是F中某条边的端点的边集合F包含于E匹配:图 G 的子图 G’ 中的任意两条边都不存在相同的顶点,称 G’ 为 G 的一个匹配最大团:在一个无向图中找出一个点数最多的完全图最大匹配:边数最多的 G’最大独立集 = 所有顶点数 – 最小点覆盖 = 所有顶点数 – 二分图最大匹配原创 2020-12-28 16:39:15 · 114 阅读 · 0 评论 -
[图论]差分约束
洛谷 – P1993 – 小K的农场https://www.luogu.org/problem/P1993#include<bits/stdc++.h>#define inf 0x3f3f3f3fusing namespace std;typedef pair<int, int> pii;typedef long long ll;const int maxn = 4e5 + 10;struct edge{ int v, c;};vector<edge原创 2020-11-04 21:51:14 · 71 阅读 · 0 评论 -
第二届全国高校绿色计算大赛 预赛第二阶段(C++)第2关 运输成本(tarjan求强连通分量 + 缩点 + 拓扑排序 + dp)
https://www.educoder.net/shixuns/g3ep48lh/challenges首先用tarjan求出所有的强连通分量,然后把强连通分量缩点,具体的做法是,把强连通分量内部的点之间的边删掉,只留两两强连通分量之间的边,重新建图,之后这个图就是一个有向无环图,拓扑排序之后dp求最长路就好了。顺便保存个tarjan的模板。#ifndef __SOLVER_H__#define __SOLVER_H__#include <bits/stdc++.h>using n原创 2020-11-04 21:34:02 · 512 阅读 · 0 评论 -
[图论]分层图最短路
ABC132 – E – Hopscotch Addicthttps://atcoder.jp/contests/abc132/tasks/abc132_e分层图的思想很重要。这题算比较简单的,因为每次都要走三步,我们假设每次只走一步,那么每个点就有三种状态:起点(终点)、走一步到达的点、走两步到达的点,那么我们把图分成三层,每走一步相当于往下一层图走,只有每三步到达的点才是最终停下来的点,连边的时候就连到下一层对应的点,这个方法同时也能很好的处理环的情况,建完图bfs一下就好了。#include&原创 2020-11-02 17:41:11 · 222 阅读 · 0 评论 -
[图论]树上启发式合并
https://codeforces.com/contest/600/problem/E#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1e5 + 10, mod = 1e9 + 7; vector<int> g[maxn];int n,ma,a[maxn],cnt[maxn],fa[maxn],dep[maxn],sz[maxn],son[maxn],to原创 2020-11-04 21:24:28 · 96 阅读 · 0 评论 -
[图论]Tarjan
!一定要注意,图不一定连通,所以每个点都要跑一遍tarjan。求强连通分量void tarjan(int u){ dfn[u] = low[u] = ++tid; sta[++top] = u; vis[u] = 1; for(int v : g[u]){ if(!dfn[v]){ tarjan(v); low[u] = min(low[u], low[v]); }else{原创 2020-11-04 21:24:53 · 112 阅读 · 0 评论 -
[图论]最小生成树
kruskal算法#include<bits/stdc++.h>#define maxn 10005struct edge{ int u, v, c;}g[maxn];int par[maxn];int find(int x){return par[x] < 0 ? x : par[x] = find(par[x]);}bool comp(edge a, edge b){return a.c < b.c;}int main(){ int n, m;原创 2020-07-22 16:00:19 · 104 阅读 · 0 评论 -
[图论]最短路径
如果边权都是1直接bfs求最短路即可。如果边权是1/0,那么就把0在队头插入即可,相当于跳过了这条边,时间复杂度O(m)。SPFA:就是把优先队列改成队列,然后while改成下面的就可以了,松弛操作和dijkstra一样,就是多了个used数组,SPFA可以处理有负权边的最短路。while(!qi.empty()){ int u = qi.front(); qi.pop(); used[u] = false; for (int i = 0; i < g[u].size();原创 2020-07-22 15:57:15 · 159 阅读 · 0 评论 -
[图论]最小生成树
kruskal算法#include<bits/stdc++.h>#define maxn 10005struct edge{ int u, v, c;}g[maxn];int par[maxn];int find(int x){return par[x] < 0 ? x : par[x] = find(par[x]);}bool comp(edge a, edge b){return a.c < b.c;}int main(){ int n, m;原创 2020-07-22 15:54:41 · 116 阅读 · 0 评论