![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
图论
_WAWA鱼_
郑州大学退役ACMer,已签约小米浏览器内核开发,曾在科大讯飞实习做大模型SDK,努力成长中,欢迎大家一起学习和交流~
展开
-
Floyd复盘
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]); 1.最短路 牛的旅行 这题是Floyd的经典应用,需要注意的是分类讨论的情况 #inclu原创 2022-02-15 23:12:30 · 315 阅读 · 0 评论 -
灾后重建---Floyd思想
以后读题一定要看清楚条件 这题时间数组是不减的,查询时也是不减的,没看到,映射半天。。。 题目链接 #include <iostream> #include <cstring> #include <algorithm> using namespace std; typedef pair<int, int> PII; const int N = 210,INF=0x3f3f3f3f; int w[N]; int d[N][N]; int n,m; signe原创 2022-02-15 16:00:17 · 206 阅读 · 0 评论 -
道路与航线--dfs+topsort+dijkstra+建图
算法流程 1.先输入所有双向道路,然后DFS出所有连通块,计算两个数组:id[]存储每个点属于哪个连通块;vector<int> block[]存储每个连通块里有哪些点: 2.输入所有航线,同时统计出每个连通块的入度。 3.按照拓扑序依次处理每个连通块,先将所有入度为0的连通块的编号加入队列 中。 4.每次从队头取出一个连通块的编号bid 5.将该block[bid]中的所有点加入堆中,然后对堆中所有点跑dijkstra算法。 6.每次取出堆中距离最小的点ver。 7.然后遍历ver的所有邻..原创 2022-02-14 10:51:03 · 156 阅读 · 0 评论 -
图论之无向图的双连通分量-----tarjan算法
一.模板 跟有向图的强连通分量不同的是,无向图有桥和割点之分,无桥称为边双连通分量,无割点称为点双连通分量 void tarjan(int u,int fa) { dfn[u]=low[u]=++timestamp; stk[++top]=u; for(int i=h[u];i!=-1;i=ne[i]) { int j=e[i]; if(j==fa)continue; if(!dfn[j]) {原创 2021-11-01 22:18:19 · 289 阅读 · 0 评论 -
有向图的强连通分量-----tarjan算法
模板 void tarjan(int u){ dfn[u]=low[u]=++timestamp; stk[++top]=u,in_stk[u]=true; for(int i=h[u];i!=-1;i=ne[i]){ int j=e[i]; if(!dfn[j]){ tarjan(j); low[u]=min(low[u],low[j]); } else if(in_st原创 2021-10-31 18:34:43 · 103 阅读 · 0 评论 -
图论之最近公共祖先------LCA倍增算法
1.祖孙询问(模板题) #include <iostream> #include <cstring> #include <algorithm> #include<cstdio> using namespace std; const int N = 40010,M=2*N; int n,m; int h[N],e[M],ne[M],idx; int depth[N],fa[N][16]; int q[N]; void add(int a, int b) {原创 2021-10-29 15:32:45 · 125 阅读 · 0 评论 -
图论之差分约束
一.差分约束讲解 差分约束两大应用 应用一: 1 求不等式组的可行解 ⭐源点需要满足的条件: 从源点出发,一定可以走到所有的边 否则 用单源最短路做的话 有一条边走不到 则该边对应的不等式就无法满足 某一个点x[i]走不到无所谓(某个点走不到代表它不受限制,x[i]取任意数都可以) 过程: 1 把每个x[i] ≤ x[j] + C[k]不等式转化为一条从x[j]走到x[i]长度为C[k]的边 2 然后在这个图上找一个超级源点,使得该源点一定可以遍历到所有边 3 从源点求一遍 单源最短路 3.1 假如存在负环原创 2021-10-29 09:35:39 · 244 阅读 · 0 评论 -
图论之负环问题
一.模板 1.spfa判断负环 #include <iostream> #include <cstring> #include <algorithm> #include <queue> using namespace std; const int N = 100010; int e[N],ne[N],w[N],h[N],idx=0; bool st[N]; int n,m; int dist[N]; int cnt[N]; void add(int a,int原创 2021-10-28 17:06:12 · 265 阅读 · 0 评论 -
图论之最小生成树问题
一.最小生成树算法模板 1.prim算法(类似于dijkstra,不同之处在于一个是点一个是集合) //本模板为稠密图模板 #include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 550; const int INF = 0x3f3f3f3f; int g[N][N]; int dist[N]; bool st[N]; int n,m;原创 2021-10-28 12:43:01 · 125 阅读 · 0 评论 -
图论之最短路问题题目集
第一部分————模板 一.单源最短路 dijkstra算法 注意:边权必须为非负 1.Dijkstra求最短路 I 稠密图用邻接矩阵 #include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 510; int g[N][N]; int dist[N]; bool st[N]; int n,m; int dij() { memset(d原创 2021-10-26 22:22:56 · 622 阅读 · 0 评论 -
道路与航线——图论综合性最短路问题,综合性太强把他单独拎出来了
道路与航线–dfs+topsort+dijkstra+建图方式 算法流程 1.先输入所有双向道路,然后DFS出所有连通块,计算两个数组:id[]存储每个点属于哪个连通块;vector<int> block[]存储每个连通块里有哪些点: 2.输入所有航线,同时统计出每个连通块的入度。 3.按照拓扑序依次处理每个连通块,先将所有入度为0的连通块的编号加入队列 中。 4.每次从队头取出一个连通块的编号bid 5.将该block[bid]中的所有点加入堆中,然后对堆中所有点跑dijkstra算法。 6.原创 2021-10-23 20:04:36 · 214 阅读 · 0 评论 -
图论之拓扑结构
有向无环图特点:(1)每个状态没有后效性 1.有向图的拓扑序列 题目链接 #include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 100010; int e[N],ne[N],h[N],idx=0; int q[N]; int n,m; int d[N]={0}; void add(int a,int b) { e[idx]=b,n原创 2021-10-20 12:44:33 · 887 阅读 · 0 评论