11 2020 档案
-
图算法--二分图的最大匹配(匈牙利算法)
摘要:二分图的最大匹配的意思就是给定一个二分图,找出最多的边,使得一个点不会同时在两条边的端点上。 举个例子就是,有一堆男生和一堆女生,每个男生和某些女生相互之间有一定的好感度,我们作为月老,秉持宁拆一座庙,不毁一桩婚的原则,希望最后的配对数目最多。 而匈牙利算法就是解决这样一个问题的算法。 匈牙利算法的 阅读全文
-
图算法--染色法判定二图
摘要:二分图的定义是可以把一个图的点分成两个集合,使得集合内部没有边 可以证明如果一个图可以被2染色,那么它就是一个二分图 1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 const int N=1e5+10,M=2*N; 阅读全文
-
图算法--kruskal
摘要:kruskal算法的时间复杂度瓶颈在排序上 1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 int n,m; 5 const int N=1e5+10,M=2e5+10,INF=0x3f3f3f3f; 6 str 阅读全文
-
图算法--最小生成树prim
摘要:思路类似于dijkstra,只不过松弛的时候略微不同,松弛成到已经确定的任一点的最短距离,而dijkstra则是松弛为到起点的最短距离 1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 const int N=510, 阅读全文
-
图算法--判负环
摘要:bellman-ford判负环,据bellman-ford的性质最后得出的是通过不超过n-1条边的从起点到其他点的最短距离(因为n个点,所以n-1条边) 但是如果在n-1次循环之后仍然存在边可以被松弛,那么就存在负环(因为如果没有负环n-1次就已经确定了最短距离,具体可参考bellman-ford证 阅读全文
-
图算法--floyd
摘要:floyd是用来解决多源最短路的 其核心思想是动态规划,d[ k , i , j ] 表示以不超过k的点为中间点从 i 到 j 的最短距离 d[k , i , j ]=min(d[k-1 , i , j ] ,d[k-1 , i ,k ]+d[k-1, k , j ]); 为了保证k的状态都是从k- 阅读全文
-
图算法--spfa
摘要:spfa的最坏时间复杂度是O(nm),但是一般达不到这么高 spfa是bellman-ford算法的升级版,bellman-ford是每次对所有的边判断是否可以松弛,但是实际上只有从刚刚松弛的点出发的边才有可能松弛其他点 所以就可以省去很大一部分的判断 1 #include<iostream> 2 阅读全文
-
图算法--bellman-ford (nm)
摘要:bellman-ford是一个可以求带负权边的单源最短路,但是时间复杂度是铁定的O(nm),所以我们一般用他的优化版本SPFA,不过由于bellman-ford算法的流程,它也可以用来解决一类特定的问题 那就是求出起点到其他点经过不大于k条边的最短路径 1 #include<iostream> 2 阅读全文
-
图算法--堆优化版dijkstra
摘要:单源最短路+正权图+稀疏图 >堆优化dijkstra 1 #include<iostream> 2 #include<vector> 3 #include<cstring> 4 #include<queue> 5 using namespace std; 6 int n,m; 7 const int 阅读全文
-
图算法--朴素版dijkstra
摘要:单源最短路+正权图+稠密图 >朴素版dijstra 1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 const int N=510; 5 int g[N][N],dis[N]; 6 bool st[N]; 7 int 阅读全文
-
图算法--最短路问题知识结构
摘要: 阅读全文
-
图算法--拓扑序列
摘要:1 #include<cstring> 2 #include<iostream> 3 using namespace std; 4 int n,m; 5 const int N=1e5+10; 6 int h[N],e[N],ne[N],idx; 7 int q[N],d[N]; 8 void ad 阅读全文
-
数据结构--数组模拟队列
摘要:1 #include<iostream> 2 using namespace std; 3 const int N=1e5+10; 4 int m; 5 int head=0,tail=-1; 6 int q[N]; 7 int main(void){ 8 int m; 9 cin>>m; 10 f 阅读全文
-
数据结构--数组模拟栈
摘要:1 #include<iostream> 2 using namespace std; 3 const int N=1e5+10; 4 int m,idx; 5 int stk[N]; 6 int main (void){ 7 cin>>m; 8 for(int i=0;i<m;i++){ 9 st 阅读全文
-
数据结构--数组模拟双链表
摘要:1 // (1) 在最左侧插入一个数; 2 3 // (2) 在最右侧插入一个数; 4 5 // (3) 将第k个插入的数删除; 6 7 // (4) 在第k个插入的数左侧插入一个数; 8 9 // (5) 在第k个插入的数右侧插入一个数 10 #include<iostream> 11 #incl 阅读全文
-
数据结构--数组模拟单链表
摘要:1 // (1) 向链表头插入一个数; 2 3 // (2) 删除第k个插入的数后面的数; 4 5 // (3) 在第k个插入的数后插入一个数 6 #include<iostream> 7 #include<algorithm> 8 using namespace std; 9 const int 阅读全文