图论一
0、目录
图的表示、图的搜索、图论知识点整理
1、图的表示
1.1、邻接矩阵
mat[u][v]表示从u到v边权为mat[u][v]。
1.2、邻接表
1.2.1、静态指针
//支持重边
struct Edge {
int u, v, w,ne;
Edge(int u, int v, int w, int ne) :u(u), v(v), w(w),ne(ne) {}
Edge() {}
}egs[maxm];
int head[maxn], tot;
//添加边
void addEdge(int u, int v, int w) {
egs[tot] = Edge(u, v, w,head[u]);
head[u] = tot++;
}
//初始化
void init() {
memset(head, -1, sizeof(head));
tot = 0;
}
//遍历
int p = head[u];
while (~p) {
Edge& e = egs[p];
//......
p = e.ne;
}
1.2.2、vector
1.2.2.1、
//支持重边
vector<Edge> egs
vector<int> G[maxn];
//加边
void addEdge(int u, int v, int w) {
egs.push_back(Edge(u, v, w));
G[u].push_back(egs.size() - 1);
}
//遍历
for (int i = 0; i < G[u].size(); i++) {
Edge& e = egs[G[u][i]];
//......
}
1.2.2.2、简单版
//不支持重边
vector<int> G[maxn];
//添加边:
G[u].push_back(v);
//遍历
for (int i = 0; i < G[u].size(); i++) {
int v = G[u][i];
}
2、图的搜索
2.1、BFS求最短路
int d[maxn];
void bfs(int s,int t) {
memset(d, -1, sizeof(d));
queue<int> Q;
Q.push(s),d[0]=0;
while (!Q.empty()) {
int u = Q.front(); Q.pop();
if (u == t) return d[u];
for (int i = 0; i < G[u].size(); i++) {
int v = G[u][i];
if (d[v] == -1) {
d[v] = d[u] + 1;
Q.push(v);
}
}
}
return -1;
}
2.2、DFS求连通块
/*
摘入自白皮
*/
vector<int> G[maxn];
int vis[maxn];
void dfs(int u) {
vis[u] = 1;
PREVISIT(u);
for (int i = 0; i < G[u].size(); i++) {
int v = G[u][i];
if (!vis[v]) dfs(v);
}
POSTVISIT(u);
}
//求连通块
void find_cc() {
current_cc = 0;
memset(vis, 0, sizeof(vis));
for (int u = 0; u < n; u++) if (!vis[u]) {
current_cc++;
dfs(u);
}
}
3、图的知识点整理
- 最短路
- floyd
- dijkstra
- spfa
- 生成树
- 最小生成树(kruskal,prim)
- 次小生成树
- 增量最小生成树
- 最小瓶颈生成树(kruskal)
- 最小树形图(朱刘算法)
- 最小瓶颈路(二分+bfs||最小生成树)
- 生成树计数问题(prufer序列,Matrix-Tree定理)
- 最近公共祖先(倍增在线O(nlogn),tarjan离线O(n) )
- 最远顶点对(O(n))
- 树的直径、中心、重心,dfs序,树链剖分
- 连通性
- 无向图的割顶和桥(用有向图的强连通分量的方法给无相图缩点,缩完之后剩下的就是桥)
- 无相图的双联通分量
- 有向图的强连通分量(两次dfs||tarjan)
- 二分图
- 二分图最大匹配
- 最大独立集(节点总数-最大匹配)
- 最小覆盖(等于最大匹配)
- DAG的最小路径覆盖数(顶点树-对于二分图的最大匹配数)
- 二分图最佳完美匹配
- 稳定婚姻问题
- 基础
- 拓扑排序
- 欧拉回路(有向图、无向图、通路、回路、构造)
- 并查集(判环,判连通分量,集合操作)
- 黑白染色(判奇环)
- 差分约束(最短路spfa)
- 表达式树
- 进阶
- 最大流
- 最小费用最大流
- 最小割
- 有上下界限制的最大流
- 2-SAT
- 还未了解的(查了查,已哭瞎,orz)
- 哈密顿回路
- 第k小生成树
- 最优比例生成树
- 最小度限制生成树
- 平面点的欧几里德最小生成树
- 平面点的曼哈顿最小生成树
- 全源最短路Johnson算法
- 次短路径
- 第k短路径
- 平面点对的最短路径(优化)
- 双标准限制最短路径
- 节点有限制的网络流
- 无向图最小割->Stoer-Wagner算法
- 有向图和无向图的边不交路径
- 含负费用的最小费用最大流
- Hungary算法
- 一般图的最大基数匹配
- 一般图的赋权匹配问题
- 二分图的关键点
- 二分图的关键边
- 弦图