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算法
      • 一般图的最大基数匹配
      • 一般图的赋权匹配问题
      • 二分图的关键点
      • 二分图的关键边
      • 弦图
  • 相关阅读:
    eclipse和jdk版本对应问题
    2017第49周四黑珍珠的价值
    如何写python插件、包,放到pypi上供其他人使用
    zerorpc的安装
    httplib 和 httplib2区别之 gzip解压
    mac下报错 xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
    使用zerorpc踩的第一个坑:
    Jmeter Summariser report及其可视化
    sublime快捷键设置
    来,来,来,哥哥告诉你一个把文件搞大的方法
  • 原文地址:https://www.cnblogs.com/fenice/p/5665491.html
Copyright © 2011-2022 走看看