
图论
图算法
谁是凶手1703
这个作者很懒,什么都没留下…
展开
-
树型地铁系统【树的最小表示】
题目链接如何判断两个树是不是同构:求出每个树的最小表示。即与这棵树同构的最小的dfs序。如果两个树同构,那么这两个树的最小表示 应该相同。 求树的最小表示可以递归实现,求出所有子树的dfs序,然后从小到大排序拼接起来#include<iostream>#include<vector>#include<algorithm>#include<stri...原创 2019-08-08 19:57:11 · 272 阅读 · 0 评论 -
电话列表【tire树】【前缀】
https://www.acwing.com/problem/content/description/163/思路:字典树:①当前串是否为字典树中的前缀:当前串没有申请新的节点,②树中的某一串是否为当前串的前缀,当前串进过end标记#include <cstring>#include <iostream>#include <algorithm>us...原创 2019-08-09 14:36:20 · 191 阅读 · 0 评论 -
可达性统计【拓扑排序】【bitset】
给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量。输入格式第一行两个整数N,M,接下来M行每行两个整数x,y,表示从x到y的一条有向边。输出格式输出共N行,表示每个点能够到达的点的数量。数据范围1≤N,M≤30000输入样例:10 103 82 32 55 95 92 33 94 82 104 9输出样例:1633211...原创 2019-08-09 21:20:05 · 225 阅读 · 0 评论 -
电路维修【双端队列bfs】【最短路变形】
https://www.acwing.com/problem/content/177/题目大意:给一张边权要么为1要么为0的无向图,通过双端队列bfs来计算:首先把电路板上每一个格子点(交叉点)看作无向图中的节点,我们认为两个节点x和y是某个小方格的两个对角,那么如果说x和y的线段’’,那么我们可以认为边权为0,反之如果x和y线段是’/’,那么我们的边权视为1,说明要旋转一次才能够连上.现在...原创 2019-08-11 12:58:48 · 231 阅读 · 0 评论 -
有边数限制的最短路【BF算法】【有负权】
n个点,m条边迭代n次,每次遍历所有边,进行更新迭代k次:进过不超过k条边的最短dishttps://www.acwing.com/problem/content/855/#include<iostream>#include<string.h>using namespace std;const int N=10000+10;struct node{ ...原创 2019-08-14 17:51:03 · 201 阅读 · 0 评论 -
spfa求最短路
https://www.acwing.com/problem/content/853/一个点变小,其他点才会变小队列queue存 变小的点;需要用st标记#include<iostream>#include<queue>#include<string.h>using namespace std;const int N=1e6+10;int n...原创 2019-08-14 20:37:53 · 97 阅读 · 0 评论 -
spfa求负权环
求负权环用spfa增加cnt数组,记录1到i 的边数,cnt【i】>=n 有负权环https://www.acwing.com/problem/content/854/#include<iostream>#include<queue>#include<string.h>using namespace std;const int N=1e4+...原创 2019-08-14 20:41:38 · 159 阅读 · 0 评论 -
食物链【带权并查集】
//涉及到集合,合并 使用并查集https://www.acwing.com/problem/content/description/242/#include<iostream>using namespace std;const int N=50000+10;int f[N],d[N];int n,k;//x-->f[x]---->rootint find(...原创 2019-08-15 11:35:59 · 104 阅读 · 0 评论 -
二分图的最大匹配【匈牙利算法】
https://www.acwing.com/problem/content/description/863/题意:给定一个二分图,其中左半部包含n1个点(编号1~n1),右半部包含n2个点(编号1~n2),二分图共包含m条边。数据保证任意一条边的两个端点都不可能在同一部分中。请你求出二分图的最大匹配数。匈牙利算法 ::男女配对,最大红线数枚举每个男生,如果找到匹配,res++...原创 2019-08-15 16:21:36 · 152 阅读 · 0 评论 -
稀疏图 堆优化 迪杰斯特拉
#include<bits/stdc++.h>using namespace std;const int N=1e5+10;typedef pair<int,int>pll;int n,m;int h[N],e[N],ne[N],idx,w[N];int dis[N];void add(int a,int b,int c){ w[idx]=c; ...原创 2019-08-22 11:00:26 · 275 阅读 · 0 评论 -
有边数限制的最短路【BF算法】
https://www.acwing.com/problem/content/description/855/bf算法:迭代n次(边数限制为n)枚举所有边#include<bits/stdc++.h>using namespace std;const int N=11111;int n,m,k;struct node{ int x,y,z;};node edg...原创 2019-08-22 11:39:52 · 276 阅读 · 0 评论 -
spfa求最短路
https://www.acwing.com/problem/content/submission/code_detail/283182/#include<iostream>#include<queue>#include<string.h>using namespace std;const int N=1e6+10;int n,m;int h[N]...原创 2019-08-22 14:22:15 · 177 阅读 · 0 评论 -
spfa判断负环
#include<bits/stdc++.h>using namespace std;const int N=1e5+10;int n,m;int h[N],e[N],w[N],ne[N],idx;void add(int a,int b,int c){ w[idx]=c; e[idx]=b; ne[idx]=h[a]; h[a]=idx++;...原创 2019-08-22 14:30:05 · 184 阅读 · 0 评论 -
prim算法求最小生成树 稀疏图
https://www.acwing.com/problem/content/860/#include<iostream>#include<string.h>using namespace std;const int N=510;int g[N][N],dis[N];int n,m;bool st[N];int prim(){ int res=0...原创 2019-08-22 15:00:27 · 429 阅读 · 0 评论 -
克鲁斯卡尔 最小生成树
#include<iostream>#include<algorithm>using namespace std;const int N=200010;int n,m;int p[N];struct node{ int a,b,w; bool operator<(const node &t){ return w<...原创 2019-08-22 15:15:10 · 155 阅读 · 0 评论 -
染色法判断二分图
#include<bits/stdc++.h>using namespace std;int n,m;const int N=1e5+10;int h[N],e[N*2],ne[N*2],idx;int color[N];void add(int a,int b){ e[idx]=b; ne[idx]=h[a]; h[a]=idx++;}boo...原创 2019-08-22 15:51:04 · 190 阅读 · 0 评论 -
匈牙利算法【二分图的最大匹配】
https://www.acwing.com/problem/content/description/863/#include<bits/stdc++.h>using namespace std;const int N=1e5+10;int h[N],e[N*2],ne[N*2],idx;int match[N];bool vis[N];void add(int a,i...原创 2019-08-22 15:52:35 · 122 阅读 · 0 评论 -
走廊泼水节【最小生成树变种】
https://www.acwing.com/problem/content/description/348/题意:给定一棵N个节点的树,要求增加若干条边,把这棵树扩充为完全图,并满足图的唯一最小生成树仍然是这棵树。求增加的边的权值总和最小是多少。思路 克鲁斯卡尔变种 使用并查集 把边排序,如果俩端不在同一集合,连边,权重为w 要成为完全图,其他边权重为w+1,...原创 2019-08-22 21:31:01 · 230 阅读 · 0 评论 -
程序自动分析【并查集+离散化】
在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足。考虑一个约束满足问题的简化版本:假设x1,x2,x3,…代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变量相等/不等的约束条件,请判定是否可以分别为每一个变量赋予恰当的值,使得上述所有约束条件同时被满足。例如,一个问题中的约束条件为:x1=x2,x2=x3,x3=x4,x1≠x4,这些约束条件显然是不可能同时被满...原创 2019-08-24 15:15:02 · 104 阅读 · 0 评论 -
超市【贪心+并查集优化】
https://www.acwing.com/solution/acwing/content/1350/贪心策略:在不过期的时间内优先卖出利润更大的产品。按照价值降序,每次扫描到一个价值,尝试一下在过期之前能不能卖出去;此时可能已经有比它更大价值的产品占用了一些日期,于是从过期时间往前面找,直到找到一个空位置。如果这个空位置大于0,那么就把这个产品安排在这天卖出。暴力找位置最坏复杂度可以达...原创 2019-08-24 19:27:56 · 179 阅读 · 0 评论 -
银河英雄传说【带权并查集】
添加链接描述d[N] 数组记录离父节点的距离,size数组记录父节点的大小#include <bits/stdc++.h>using namespace std;const int N=31000+10;int fa[N],n,t,i,j,d[N],size[N];//size就是记录个数int get(int x){ if(x==fa[x] ) return x...原创 2019-08-24 20:33:53 · 128 阅读 · 0 评论 -
奇偶游戏【并查集】【离散化】【poj1733】
添加链接描述题解来自:https://www.acwing.com/solution/acwing/content/1006/#include<bits/stdc++.h>using namespace std;const int N=2e4+10;struct { int l,r,ans;}q[20010];int a[N],fa[N],d[N],n,m,t;...原创 2019-08-24 22:02:30 · 172 阅读 · 0 评论 -
奇偶游戏【扩展域并查集】
题目链接 点这里把每个点拆成俩个节点:x_odd和x_even 分别表示为奇数或者偶数,奇数域 和偶数域``#include#includeusing namespace std;const int N=2e4+10;struct{int l,r,op;}q[N];int n,m,b[N],cnt,f[N];int get(int x){return x==f[x]?x...原创 2019-08-25 10:12:03 · 214 阅读 · 0 评论 -
食物链【拓展域并查集】
题目链接拓展域并查集:拆点拆成3种,A,B, C判断是否满足用==,不可以用!=间接判断#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>#define rep(i,a,b) for(int i = a;i <= b;i++)...原创 2019-08-25 11:33:21 · 161 阅读 · 0 评论 -
通信线路【二分+堆优化迪杰斯特拉】
题目链接题意:求一d条1 到 n的路径,使得路径上第k+1大的边权最小单调性:二分答案k+1条的边权mid 如果mid小了,那越多的边>=mid,我们最后取到k#include<bits/stdc++.h>using namespace std;const int N=2e5+10;int h[N],e[N],w[N],idx,ne[N];int n,p,k;...原创 2019-08-25 17:11:57 · 198 阅读 · 0 评论 -
最优贸易【俩次迪杰斯特拉】【最短路变形】
题目链接————》题目大意:在一张节点带有权重的图上找一条1到n的路径,路径上找俩个点 p , q;使得点p的权重尽量小,点q的权重尽量大,迪杰斯特拉跑正图,从1号点,把普通的最短路dis数组记录从1号点到n号点的最短距离改为minn数组记录从1号点到n号点的最小值这样找到从1 到 x的最小值接下来找 x到 n的最大值我们可以换着思维,找n到x的最大值,由x到n 是正向图,由...原创 2019-08-26 21:50:31 · 154 阅读 · 0 评论 -
并查集判树
给一堆边,判断是不是一颗树并查集的操作#include<stdio.h>#include<string.h>#define N 1000int p[N]={0};int find(int x){ //return x==p[x]?x:p[x]=find(p[x]); while(x!=p[x]) x=p[x]; return x...原创 2019-12-09 21:07:14 · 130 阅读 · 0 评论 -
树的中心
树的中心题意找到一个点使最远的点最小思路画出一颗树,找到一个点,这个点的最远距离,有俩种,一种是往下走,另外一种是往上走,往上走还有俩种,一种是再往上走另外一种是往下走,因此,我们需要,dfs出每个点到叶子节点的最大值,再dfs出每个点往上走的最大值代码#include<iostream>#include<string.h>#include<...原创 2020-01-30 23:03:32 · 262 阅读 · 0 评论 -
数字转换 树的最长链
数字转换 树的最长链链接:https://www.acwing.com/activity/content/problem/content/1304/1/题意:如果一个数 x 的约数之和 y(不包括他本身)比他本身小,那么 x 可以变成 y,y 也可以变成 x。例如,4 可以变为 3,1 可以变为 7。限定所有数字变换在不超过 n 的正整数范围内进行,求不断进行数字变换且不出现重复数字的最...原创 2020-01-31 14:30:03 · 388 阅读 · 0 评论 -
苹果二叉树 有依赖的分组背包
苹果二叉树 分组背包链接思路有依赖性的分组背包树形dpf[u][j] 根节点是u,边是j的最大值分组背包:枚举组,枚举体积,枚举决策代码#include<iostream>#include<string.h>#include<algorithm>using namespace std;const int N=2e5;int e[N]...原创 2020-01-31 15:59:58 · 190 阅读 · 0 评论 -
没有上司的舞会+战略游戏【树形dp】
没有上司的舞会链接:链接题意:一颗树,点上有权值,一条边最多选一个点,求最大权重代码#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 6010;int n;int h[N], e[N], ne[N], ...原创 2020-01-31 17:47:58 · 150 阅读 · 0 评论 -
最小支配集【皇宫看守】
皇宫看守 最小支配集链接:链接题意给一颗树,最小支配集思路和没有上司的舞会有区别,没有上司的舞会是一条边相邻的俩个点至少选一个点属于最小点覆盖最小点覆盖需要考虑 父节点,子节点,本身节点的状态f[u][0] 表示u节点被父节点的看到的最小花费f[u][1] 表示u节点被子节点看到的最小花费f[u][2] 表示u节点自己被放置的最小花费f[u][0] += sigma m...原创 2020-01-31 23:27:42 · 184 阅读 · 0 评论 -
基础数据结构【单调栈】【单调队列】【KMP】【字典树】【并查集】【字符串哈希】
单调栈 最经典的题:左边最近的比它小的数 3,4这种情况,只要有3在,4永无出头之日,因此序列单调递增减代码#pragma comment(linker, "/STACK:1024000000,1024000000")#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<string>#include<vect原创 2020-08-14 10:20:52 · 138 阅读 · 0 评论 -
畅通工程 HDU - 1863【】
畅通工程Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 15572 Accepted Submission(s): 6462Problem Description省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通...原创 2019-04-19 21:51:40 · 111 阅读 · 0 评论 -
拓扑排序
queue<int>q; for(int i=0;i<n;i++) //n 节点的总数 if(in[i]==0) q.push(i); //将入度为0的点入队列 vector<int>ans; //ans 为拓扑序列 while(!q.empty()) { int p=q.top(); q.po...原创 2019-04-19 21:21:15 · 87 阅读 · 0 评论 -
Binary Trees Aizu - ALDS1_7_B【二叉数的表达】
清明节和朋友去了次晋祠,走了2万多步,累!回宿舍收拾了一下,萌新开始学习!!加油,少年。晋祠成就了大唐盛世,必有帝王之龙脉所依托,其所依后山悬瓮山,龙脉雄健,体量大,两侧的护砂拱护,众多溪水汇入明堂内。唐之后的北宋宋太宗害怕晋祠风水,怕居住在那里的百姓当中,因为脉气的关系,会产生一位人物,与他抗衡继而危及到他的江山,曾经下令晋祠附近的百姓远迁至邻近的阳曲县内A rooted binary tr...原创 2019-04-05 20:30:25 · 141 阅读 · 0 评论 -
有根树的表达【左子右兄弟表达法】
左子右兄弟表达法的实现struct node{ int p,l,r;}T[N];使用【左子右兄弟表达法】必须引用初始化函数(为了显示节点在树中的地位)://对所有节点初始化 void init(){ for(int i=0;i<n;i++){ T[i].P=T[i].l=T[i].r=NIL; }}使用递归函数用数组储存节点的深度void rec(int u,...原创 2019-04-04 15:33:59 · 403 阅读 · 0 评论 -
图论简单算法小总结
八数码#pragma comment(linker, "/STACK:1024000000,1024000000")#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<string>#include<vector>#include<stack>#include<bitset>#includ原创 2020-08-14 10:23:07 · 161 阅读 · 0 评论 -
树形DP总结【acwing提高课】
树的最长路径思路基本想法就是dfs求出子树的最大高度基于这个求出最大高度、次大高度代码#include<bits/stdc++.h>using namespace std;const int N=2e4+100;int h[N],ne[N],w[N],e[N],idx;void add(int a,int b,int c){ e[idx]=b; ne[idx]=h[a]; w[idx]=c; h[a]=idx++;}int n,m;int原创 2020-08-23 17:12:02 · 412 阅读 · 0 评论 -
二分图总结【acwing算法提高课】
性质一个图是二分图,图中不存在奇数环,染色法关押罪犯最优解越大,图中右半部分越是二分图染色法求二分图,这些图不一定联通!!没有必要每次cheak都建图,在染色中增加判断权重就好了代码#include<bits/stdc++.h>using namespace std;const int N=1e6+100;int h[N],ne[N],e[N],w[N],idx,rh[N];void add(int a,int b,int c){ e[idx]=b;原创 2020-08-25 17:37:05 · 536 阅读 · 0 评论