图论
文章平均质量分 52
,,,
(xsj)
模拟只会猜题意
贪心只能过样例
DP一般看规律
数论只会gcd
计算几何瞎暴力
图论只会匈牙利
数据结构没学过
字符串只能干输入
展开
-
acwing 1192 奖金(拓扑排序)
题面 题解 跑一遍拓扑排序求出所有编号在图中的前后关系 dist[i]:表示i点在拓扑图中离起点的最远距离(可能存在多起点),dist[起点] == 100,边的权值为1 代码 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e4 + 10, M = 2 * N; int n, m; int h[N], ne[M], e[M], idx; int d[N]; int原创 2021-05-11 20:06:20 · 149 阅读 · 0 评论 -
acwing 1191 家谱树
题面 题解(拓扑排序) 拓扑图:在有向图中不存在环,并且边的指向都是从前指向后的(u->v,那么对于拓扑序u一定出现在v之前),本题直接拓扑排序即可 对于输出字典序最小的方案,我们可以使用优先队列,每次先遍历字典序小的数 对于图中n个点,最多有n*(n-1)/2条边 代码 #include<bits/stdc++.h> using namespace std; const int N = 110, M = N * N / 2; int n; int h[N], e[M],原创 2021-04-17 21:27:48 · 154 阅读 · 0 评论 -
acwing 848 有向图的拓扑序列 (求图是否有环)
题面 题解 ==我们观察可以发现,对于一个有环图,这个环上的所有点入度都是不为0的,==根据这个性质,我们就可以让所有入度为0的点入队,然后再删除i->j的边(其实就是让d[j]–),当d[j]为0时,继续入队,这样如果没有环的话,我们可以让所有点都入队,最后只需要判断所有点是否已经都入队完成了,如果没有入队,说明存在环,当然,队列中的顺序就是拓扑序(拓扑序不唯一) 代码 #include<iostream> #include<cstdio> #include<原创 2021-03-05 19:29:25 · 133 阅读 · 0 评论 -
acwing 1171距离(离线LCA)
题面 题解(Tarjan——离线求LCA) 前置知识 在线做法:读一个询问,处理一个,输出一个 离线做法:读完全部询问,再全部处理完,再全部输出 做法 在深度优先遍历时,将所有点分成三大类 2号点 :代表已经访问并结束回溯的点 1号点 :代表正在进行dfs的点 0号点 :代表还没有被访问的 我们发现对于查询正在dfs的点和已经dfs过的点的最近公共祖先其实就是正在dfs路径上的点(图中绿色),那么我们就可以将所有已经dfs过的点进行合并 这题让我们求两点之间的距离 :我们先预处理出所有点到原创 2021-04-11 18:04:32 · 137 阅读 · 0 评论 -
acwing 1172 祖孙询问(LCA)
题面 题解 定义 向上标记法:O(n) 从 x 向上走到根节点,并标记所有经过的点 再从 y 向上出发,当第一次遇到被标记过的节点就是最近公共祖先 倍增法 : 询问O(logn) 预处理O(nlogn) dep[i] : 代表 i 节点的深度 ,记根节点的深度为 1 f[i] [k] : 表示 x 向上走 2k 步到达的点,若该点不存在f[x] [k] =0 ,例如 f[x] [0] 表示走20步,就是跳到了父节点 预处理 :我们可以通过倍增来求出所有的k的情况,f[x][k] = f [原创 2021-04-11 10:33:58 · 118 阅读 · 0 评论