NOIP 图论
_Tham
If you sleep now , you will hava a dream. But if you study now , you will achieve your dream.
展开
-
图论,匈牙利算法
匈牙利算法链接: USACO 4.2.2 The Perfect Stall 完美的牛栏 stall4这是一种用增广路求二分图最大匹配的算法。它由匈牙利数学家Edmonds于1965年提出,因而得名。 定义 未盖点:设Vi是图G的一个顶点,如果Vi 不与任意一条属于匹配M的边相关联,就称Vi 是一个未盖点。交错路:设P是图G的一条路,如果P的任意两条相邻的边一定是一条属于M转载 2014-08-10 18:46:13 · 844 阅读 · 0 评论 -
弗洛伊德算法Floyed(求各顶点间最短路径):可打印最短路径
#include #include #include using namespace std; #define INFINITY 65535 #define MAX_VERTEX_NUM 10 typedef struct MGraph{ string vexs[10];//顶点信息 int arcs[10][10];//邻接矩阵原创 2015-04-10 15:59:14 · 2499 阅读 · 1 评论 -
【数据结构与算法】自己动手实现图的BFS和DFS(附完整源码)
转载请注明出处:http://blog.csdn.net/ns_code/article/details/19617187图的存储结构 本文的重点在于图的深度优先搜索(DFS)和广度优先搜索(BFS),因此不再对图的基本概念做过多的介绍,但是要先大致了解下图的几种常见的存储结构。 邻接矩阵 邻接矩阵既可以用来存储无向图,也可以用来存储有向图。该结构转载 2015-04-10 16:32:58 · 1442 阅读 · 0 评论 -
数学之美系列六——图论和网络爬虫
数学之美系列六——图论和网络爬虫数学之美系列[离散数学是当代数学的一个重要分支,也是计算机科学的数学基础。它包括数理逻辑、集合论、图论和近世代数四个分支。数理逻辑基于布尔运算,我们已经介绍过了。这里我们介绍图论和互联网自动下载工具网络爬虫 (Web Crawlers) 之间的关系。顺便提一句,我们用 Google Trends 来搜索一下"离散数学"这个词,可以发现不少有趣的现象。转载 2015-04-27 22:44:49 · 1422 阅读 · 0 评论 -
[联赛可能考到]图论相关算法——COGS——联赛试题预测
COGS图论相关算法最小生成树Kruskal+ufsint ufs(int x) { return f[x] == x ? x : f[x] = ufs(f[x]);}int Kruskal() { int w = 0; for(int i=0; in; i++) f[i] = i; sort(e, e+n); f转载 2015-05-05 21:18:03 · 905 阅读 · 0 评论 -
网络流24题解题报告小结
1飞行员配对方案问题 二分图最大匹配网络最大流#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #if原创 2015-05-17 13:39:11 · 1618 阅读 · 0 评论 -
有向图强连通分量的Tarjan算法和Kosaraju算法
[有向图强连通分量]在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components)。下图中,子图{1,2,3,4}为一个强连通分量,因为顶点1,2,3,4两两可达。{5},{6}也分别是转载 2014-08-16 20:31:58 · 2142 阅读 · 0 评论 -
Victoria的舞会2——图的连通性及连通分量
【Vijos1022]】Victoria的舞会2DescriptionVictoria是一位颇有成就的艺术家,他因油画作品《我爱北京天安门》闻名于世界。现在,他为了报答帮助他的同行们,准备开一个舞会。Victoria准备邀请n个已经确定的人,可是问题来了:这n个人每一个人都有一个小花名册,名册里面写着他所愿意交流的人的名字。比如说在A的人名单里写了B,那么表原创 2020-03-23 12:30:07 · 1054 阅读 · 0 评论 -
二分图系列•二分图判定•匈牙利算法二分图的最大匹配•二分图最小点覆盖及最大独立集
二分图一•二分图判定描述大家好,我是小Hi和小Ho的小伙伴Nettle,从这个星期开始由我来完成我们的Weekly。新年回家,又到了一年一度大龄剩男剩女的相亲时间。Nettle去姑姑家玩的时候看到了一张姑姑写的相亲情况表,上面都是姑姑介绍相亲的剩男剩女们。每行有2个名字,表示这两个人有一场相亲。由于姑姑年龄比较大了记性不是太好,加上相亲的人很多,所以姑姑一时也想不起原创 2016-04-22 21:19:17 · 2690 阅读 · 0 评论 -
最近公共祖先 LCA 倍增算法
树上倍增求LCA LCA指的是最近公共祖先(Least Common Ancestors),如下图所示: 4和5的LCA就是2 那怎么求呢?最粗暴的方法就是先dfs一次,处理出每个点的深度 然后把深度更深的那一个点(4)一个点地一个点地往上跳,直到到某个点(3)和另外那个点(5)的深度一样然后两个点一起一个点地一个点地往上跳,直到到某个点(就是最近公共祖先)原创 2017-01-03 22:27:46 · 2667 阅读 · 1 评论 -
最近公共祖先(LCA)的三种求解方法
转载来自:https://blog.andrewei.info/2015/10/08/e6-9c-80-e8-bf-91-e5-85-ac-e5-85-b1-e7-a5-96-e5-85-88lca-e7-9a-84-e4-b8-89-e7-a7-8d-e6-b1-82-e8-a7-a3-e6-96-b9-e6-b3-95/简述LCA(Least Common Ancestor转载 2017-03-21 15:31:47 · 1201 阅读 · 0 评论 -
图的连通性问题
基本概念无向图连通图和非联通图: 如果无向图 G 中任意一对顶点都是连通的,则称此图是连通图(connected graph);相反,如果一个无向图不是连通图,则称为非连通图(disconnected graph)。对非连通图G,其极大连通子图称为连通分量(connected component,或连通分支),连通分支数记为w(G)。割顶集与连通度: 设V’是连原创 2017-03-21 15:50:25 · 27298 阅读 · 1 评论 -
网络流(一) 入门到熟练
一.网络流:流&网络&割1.网络流问题(NetWork Flow Problem):给定指定的一个有向图,其中有两个特殊的点源S(Sources)和汇T(Sinks),每条边有指定的容量(Capacity),求满足条件的从S到T的最大流(MaxFlow).下面给出一个通俗点的解释(下文基本避开形式化的证明 基本都用此类描述叙述)好比你家是汇 自来水厂(有需要的同...原创 2017-03-21 15:26:57 · 42738 阅读 · 19 评论 -
次短路径与次小生成树问题的简单解法
[次短路径]次短路径可以看作是k短路径问题的一种特殊情况,求k短路径有Yen算法等较为复杂的方法,对于次短路径,可以有更为简易的方法。下面介绍一种求两个顶点之间次短路径的解法。我们要对一个有向赋权图(无向图每条边可以看作两条相反的有向边)的顶点S到T之间求次短路径,首先应求出S的单源最短路径。遍历有向图,标记出可以在最短路径上的边,加入集合K。然后枚举删除集合K中每条边,求从S到T转载 2017-03-14 16:27:18 · 1194 阅读 · 0 评论 -
最小树形图——朱刘算法(Edmonds)
定义:一个有向图,存在从某个点为根的,可以到达所有点的一个最小生成树,则它就是最小树形图。朱刘算法实现过程: 【在选出入边集后(看步骤1),若有向图中不存在有向环,说明该图就是最小树形图】1,选入边集——找到除root点之外,每一个点的所有入边中权值最小的,用数组in[]记录下这个最小权值,用pre[]记录到达该点的前驱;(若图中存在独立点,最小树形图是不存原创 2017-03-14 16:47:47 · 7663 阅读 · 4 评论 -
图的基本操作(基于邻接表):图的构造,深搜(DFS),广搜(BFS)
#include #include #include using namespace std; #define MAXN 100 struct ArcNode { int adjVertex; //边到的顶点 ArcNode *next; }; struct VNode { string d原创 2014-12-02 16:04:05 · 1154 阅读 · 0 评论 -
拓扑排序(判断有向图是否有回路)
#include #include #include using namespace std; //表结点 typedef struct ArcNode{ int adjvex;//该弧所指向的顶点的位置 ArcNode *nextarc; }ArcNode; //头结点 typedef struct VNode{原创 2015-04-10 16:21:00 · 6274 阅读 · 0 评论 -
邻接表实现图的储存,遍历
邻接表是图的一种链式存储结构。对图的每个顶点建立一个单链表(n个顶点建立n个单链表),第i个单链表中的结点包含顶点Vi的所有邻接顶点。又称链接表。1.在有向图的邻接表中不易找到指向该顶点的弧。2.在有向图的邻接表中,对每个顶点,链接的是以该顶点为弧尾的邻接点。原创 2014-09-02 17:17:23 · 2052 阅读 · 0 评论 -
Prim算法和Kruskal算法
Prim算法和Kruskal算法都能从连通图找出最小生成树。区别在于Prim算法是挨个找,而Kruskal是先排序再找。 一、Prim算法: Prim算法实现的是找出一个有权重连通图中的最小生成树,即:具有最小权重且连接到所有结点的树。(强调的是树,树是没有回路的)。 Prim算法是这样来做的: 首先以一个结点作转载 2014-09-02 18:15:42 · 976 阅读 · 0 评论 -
图论,最短路径问题总结
最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。 算法具体的形式包括:原创 2014-11-07 10:35:34 · 8807 阅读 · 0 评论 -
最小生成树 Prim(普里姆)算法和Kruskal(克鲁斯特尔)算法
一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。最小生成树可以用kruskal(克鲁斯卡尔)算法或Prim(普里姆)算法求出原创 2014-11-15 21:46:48 · 2101 阅读 · 0 评论 -
基础图论问题算法总结
这里介绍了图论中常见算法的原理和实现,所有代码已打包,此处可以下载。一、邻接表存图用邻接矩阵表示稀疏图会浪费大量内存空间。而在邻接表中是通过把类似于“从顶点0出发有到顶点1、2、3、4的边”这样的信息保存在链表中来表示图的。这样只需要O(|V| + |E|)的内存空间。#include #include std::vector g[max_v];/** *边上有属性的情况 *st转载 2014-11-07 10:41:14 · 1346 阅读 · 0 评论 -
COGS NIOP联赛 图论相关算法总结
最小生成树Kruskal+ufsint ufs(int x) { return f[x] == x ? x : f[x] = ufs(f[x]);}int Kruskal() { int w = 0; for(int i=0; in; i++) f[i] = i; sort(e, e+n); for(int i=0; in转载 2014-12-01 18:40:36 · 791 阅读 · 0 评论 -
图的基本操作(基于邻接矩阵):图的构造,深搜(DFS),广搜(BFS)
Adjacency Matrix 邻接矩阵是表示一个图的常用存储表示。它用两个数组分别存储数据元素(顶点)的信息和数据元素之间的关系(边或弧)的信息。阶为n的图G的邻接矩阵A是n*n的。将G的顶点标签为v_1,v_2,...,v_n。若(v_i,v_j) \in E(G),A_{ij}=1,否则A_{ij}=0。Depth-First-Se原创 2014-12-02 15:59:40 · 1406 阅读 · 0 评论 -
求一个连通图的割点(去掉一个点后图不再连通)
题目:求一个连通图的割点,割点的定义是,如果除去此节点和与其相关的边,图不再连通,描述算法。分析:1. 最简单也是最直接的算法是,删除一个点然后判断连通性,如果删除此点,图不再连通,则此点是割点,反之不是割点(图的连通性一般通过深搜来判定,是否能一次搜索完 全部顶点);2. 通过深搜优先生成树来判定。从任一点出发深度优先遍历得到优先生成树,对于树中任一顶点V而言,其孩子节点原创 2014-12-02 16:07:16 · 3455 阅读 · 0 评论 -
最短路径:(Dijkstra & Floyd)
1.用-1表示无穷大 所以在很多判断的时候需要加上另外一重判断,老是忘了2.Floyd算法用int path[ ][ [] 存储路径所经过的顶点时申请不到足够内存(当顶点比较多的时候)换用结构降低内存,可是多了查找该点的时间3.Floyd算法在输出该路径的顺序时没法解决,感觉是因为表示路径的结构有点欠缺,再想想Dijkstra算法:按路径长度递转载 2014-09-02 17:31:22 · 1155 阅读 · 0 评论 -
最小生成树的邻接矩阵实现
求上面这个图的最小生成树原创 2014-09-02 17:50:23 · 6981 阅读 · 0 评论 -
图的 储存 深度优先(DFS)广度优先(BFS)遍历
从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(Traversing Graph)。图的遍历算法是求解图的连通性问题、拓扑排序和求关键路径等算法的基础。图的遍历顺序有两种:深度优先搜索(DFS)和广度优先搜索(BFS)。对每种搜索顺序,访问各顶点的顺序也不是唯一的。原创 2014-08-03 22:30:58 · 2755 阅读 · 0 评论 -
迪杰斯特拉算法dijkstra(可打印最短路径)
#include #include #include using namespace std; #define INFINITY 65535//无边时的权值 #define MAX_VERTEX_NUM 10//最大顶点数 typedef struct MGraph{ string vexs[10];//顶点信息 int arcs[原创 2015-04-10 16:09:00 · 4780 阅读 · 0 评论 -
最小生成树之prim算法
最小生成树之prim算法 边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权。 最小生成树(MST):权值最小的生成树。 生成树和最小生成树的应用:要连通n个城市需要n-1条边线路。可以把边上的权值解释为线路的造价。则最小生成树表示使其造价最小的生成树。 构造网的最小生成树必须解决下面两个转载 2014-09-02 18:04:57 · 1197 阅读 · 0 评论 -
最小生成树之克鲁斯卡尔(kruskal)算法
#include #include using namespace std; typedef struct MGraph{ string vexs[10];//顶点信息 int arcs[10][10];//邻接矩阵 int vexnum, arcnum;//顶点数和边数 }MGraph; int LocateVex(MGra原创 2015-04-10 16:18:44 · 848 阅读 · 0 评论 -
网络流 最大流—最小割 之SAP算法 详解
首先引入几个新名词:1、距离标号:所谓距离标号 ,就是某个点到汇点的最少的弧的数量(即边权值为1时某个点到汇点的最短路径长度)。设点i的标号为level[i],那么如果将满足level[i]=level[j]+1的弧(i,j)叫做允许弧 ,且增广时只走允许弧。2、断层(本算法的Gap优化思想):gap[i]数组表示距离标号为i的点有多少个,如果到某一点没有符原创 2017-03-24 16:40:21 · 5370 阅读 · 2 评论