图论一

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算法
    • 一般图的最大基数匹配
    • 一般图的赋权匹配问题
    • 二分图的关键点
    • 二分图的关键边
    • 弦图
原文地址:https://www.cnblogs.com/fenice/p/5665491.html