zoukankan      html  css  js  c++  java
  • 图论一

    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算法
      • 一般图的最大基数匹配
      • 一般图的赋权匹配问题
      • 二分图的关键点
      • 二分图的关键边
      • 弦图
  • 相关阅读:
    Python 爬虫js加密破解(一) 爬取今日头条as cp 算法 解密
    Python 爬虫实例(2)—— 爬取今日头条
    Python 爬虫实例(1)—— 爬取百度图片
    python 操作redis之——HyperLogLog (八)
    python 操作redis之——有序集合(sorted set) (七)
    Python操作redis系列之 列表(list) (五)
    Python操作redis系列以 哈希(Hash)命令详解(四)
    Python操作redis字符串(String)详解 (三)
    How to Install MySQL on CentOS 7
    Linux SSH远程文件/目录 传输
  • 原文地址:https://www.cnblogs.com/fenice/p/5665491.html
Copyright © 2011-2022 走看看