图论
文章平均质量分 62
小鸡炖蘑菇_
stay hungry,stay foolish.
展开
-
畅通工程
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。Input测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M ( < 100 );随后的 N 行对应村庄间道路的成本,每行给出一对正整原创 2015-08-24 16:00:26 · 631 阅读 · 0 评论 -
最小费用最大流模板
最小费用最大流一般用邻接表来实现,因为邻接矩阵不能处理平行边等等;而一条有向边是要储存两条信息,无向图的话要拆成两条有向边处理,相当于变为4条边,这也是邻接矩阵不能做到的然后最小费用最大流的原理就不讲了,讲一下实现的要注意的问题和一些技巧1.用结构体数组来保存边,最好从下标0开始保存不要从下标1开始保存,因为增广的时候需要用到位运算,从下标1保存不利于位运算2.记录路径:如果是邻接矩阵记录前驱p[v原创 2016-05-18 22:46:56 · 1319 阅读 · 0 评论 -
poj-2195-Going Home(最小费用最大流模板题)
传送门最小费用最大流模板题意: 有n个人和n个房子,让每个人都回到一个房子里面,使得所有人走的步数和最小 建图:源点0,汇点:2*n+1,从源点到汇点建立一个容量为1,费用为0 的一条边,从每个房子到汇点建立一个容量为1,费用为0 的一条边;每个人到每个房子建立一条容量为1,费用为两者距离的边。图建好之后就可以直接求最小费用最大流了#include <iostream>#include <原创 2016-05-21 19:30:21 · 845 阅读 · 0 评论 -
数据结构之平衡树(Treap)
平衡树是二叉搜索树和堆合并构成的新数据结构,所以它的名字取了Tree和Heap各一半,叫做Treap。 堆和树的性质是冲突的,二叉搜索树满足左子树<根节点<右子树,而堆是满足根节点小于等于(或大于等于)左右儿子。因此在Treap的数据结构中,并不是以单一的键值作为节点的数据域。Treap每个节点的数据域包含2个值,key和weight。 key值,和原来的二叉搜索树一样,满足左子树<根节点<右子原创 2016-06-19 17:46:12 · 26884 阅读 · 8 评论 -
数据结构之二叉排序树
二叉排序树(Binary Search Tree),又称二叉查找树、二叉搜索树 定义: 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二叉排序树; (4)没有键值相等的结点。#include <iostream>#incl原创 2016-06-18 22:57:52 · 1620 阅读 · 1 评论 -
数据结构之堆(Heap)
详情见代码中的注释/** 堆的性质* 堆中某个节点的值总是不大于或不小于其父节点的值(小顶堆或大顶堆)* 堆总是一棵完全二叉树 * * 由于堆是一个完全二叉树,所以我们可以用数组模拟树* 第i个结点的父结点是第i/2个结点* 第i个结点的左子女是第2*i个结点* 第i个结点的右子女是第2*i+1个结点* * 堆的应用* 堆排序 优先队列 *///------------原创 2016-06-19 15:46:42 · 930 阅读 · 0 评论 -
最短路径算法—Bellman-Ford(贝尔曼-福特)算法分析与实现(C/C++)
Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的。这时候,就需要使用其他的算法来求解最短路径,Bellman-Ford算法就是其中最常用的一个。该算法由美国数学家理查德•贝尔曼(Richard Bellman, 动态规划的提出者)和小莱斯特•福特(Lester Ford)发明。Bellma转载 2015-08-25 16:28:44 · 846 阅读 · 0 评论 -
次小生成树
最小生成树设G=(V, E,ω)是连通的无向图,T是图G的一个最小生成树。如果有另一棵树T1,满足不存在树T’,T’≠T, ω(T’)<ω(T1),则称T1是图G的次小生成树。定理定理:设T是图G的最小生成树,如果T1满足ω(T1)=min{ω(T’)| T’∈Not(T)},则T1是G的次小生成树。也就是说,最小生成树邻集中权值和最小的一棵生成树即为该图的次小生成树。证明: 可以证明下面一个强原创 2016-08-09 13:24:17 · 374 阅读 · 0 评论 -
最小度限制生成树
设G=(V, E, ω)是连通的无向图,v0 ∈V是特别指定的一个顶点,k为给定的一个正整数。如果T是G的一个生成树且dT(v0)=k,则称T为G的k度限制生成树。G中权值和最小的k度限制生成树称为G的最小k度限制生成树明确几个概念 T为图G的一个生成树,T+a-b记作(+a,-b),如果T+a-b仍然是一个生成树,则称(+a,-b)是T的一个可行交换。T为图G的一个生成树,由T进行一次可行交换得原创 2016-08-09 19:26:05 · 4163 阅读 · 0 评论 -
割点和桥
点连通度与边连通度 在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合。一个图的点连通度的定义为,最小割点集合中的顶点数。 类似的,如果有一个边集合,删除这个边集合以后,原图变成多个连通块,就称这个点集为割边集合。一个图的边连通度的定义为,最小割边集合中的边数。双连通图、割点与桥 如果一个无向连通图的点连通原创 2016-10-21 21:45:41 · 690 阅读 · 0 评论 -
无向图双连通分量(poj-3352)
预备知识:图的相关知识 https://www.byvoid.com/blog/biconnect/ 题目的大致意思是:在一个连通图中,至少添加多少条边,使图中不存在桥Tarjin时借助并查集,由于桥(删除之后图就不连通的边)不属于任何双连通分量,所以在Tarjin时,把不是桥的边的u,v并在一起,表示u,v在同一个双连通分量里,进行缩点。 一个重要的结论: 若要使得任意一棵树,在增加若干条边原创 2016-10-23 15:32:14 · 669 阅读 · 0 评论 -
poj-2942-Knights of the Round Tabler
题目大意: 有N个骑士,他们要开圆桌会议,也就是要坐成一个圈,相互憎恨的两个骑士是不能坐在相邻位置的,那样他们就会打起来。给出所有的憎恨关系。如果有人不可能开会,例如他可能憎恨所有人,就不能再去开会了。求这样人的个数。注意:1、所给出的憎恨关系一定是双向的,不存在单向憎恨关系。 2、由于是圆桌会议,则每个出席的骑士身边必定刚好有2个骑士。即每个骑士的座位两边都必定各有一个骑士。 3、一个骑原创 2016-10-23 19:46:59 · 350 阅读 · 0 评论 -
poj-2186-Popular Cows (tarjan算法)
题意:有n只牛,牛之间存在一些关系,比如a认为b很受欢迎,b认为c很受欢迎,这样呢,a也会认为c很受欢迎,问根据给出的关系,有多少头牛被其他所有的牛都认为是受欢迎的?思路:求强连通分量缩点后反向建图 然后判断图中是否有且仅有一个点的入度为 0,是的话就输出这个店包含的牛的个数,否则就输出 0#include <iostream>#include <cstdio>#include <cstdli原创 2016-10-25 20:28:59 · 423 阅读 · 0 评论 -
poj-2449-Remmarguts' Date(A*算法+Dijkstra)
题目就是求两点之间第k短路,但如何起点和终点相等的时候,k需要加1涉及到的算法是Dijkstra和A*寻路算法#include <iostream>#include <iomanip>#include <cstdio>#include <cstdlib>#include <cstring>#include <string>#include <cmath>#include <queue>原创 2016-10-27 20:15:03 · 642 阅读 · 0 评论 -
poj-1041-John's trip(计算欧拉路)
计算欧拉路,如果欧拉路存在,就数组欧拉路上的边的编号;如果有多条欧拉路,输出字典序最小的那一条。而且题目保证了图的连通性图G,若存在一条路,经过G中每条边有且仅有一次,称这条路为欧拉路,如果存在一条回路经过G每条边有且仅有一次, 称这条回路为欧拉回路。具有欧拉回路的图成为欧拉图。 判断欧拉路是否存在的方法 有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都是出度=入度。原创 2016-10-27 21:43:18 · 645 阅读 · 1 评论 -
混合图的欧拉回路求解方法(转)
原文地址http://yzmduncan.iteye.com/blog/1149049基础知识 欧拉回路是图G中的一个回路,经过每条边有且仅一次,称该回路为欧拉回路。具有欧拉回路的图称为欧拉图,简称E图。 无向图中存在欧拉回路的条件:每个点的度数均为偶数。 有向图中存在欧拉回路的条件:每个点的入度=出度。 欧拉路径比欧拉回路要求少一点: 无向图中存在欧拉路径的条件:每个点的度数均为偶数或者转载 2016-10-29 13:16:05 · 1507 阅读 · 0 评论 -
Hopcroft-Harp 算法
匈牙利算法原理 为了降低时间复杂度,可以在增广匹配集合M时,每次寻找多条增广路径。这样就可以进一步降低时间复杂度,可以证明,算法的时间复杂度可以到达O(sqrt(n)*m)。 基本算法 该算法主要是对匈牙利算法的优化,在寻找增广路径的时候同时寻找多条不相交的增广路径,形成极大增广路径集,然后对极大增广路径集进行增广。在寻找增广路径集的每个阶段,找到的增广路径集都具有相同的长度,且随着算法的进行转载 2016-10-29 17:02:00 · 1021 阅读 · 0 评论 -
KM算法详解+模板(转)
KM算法用来求二分图最大权完美匹配。 本文配合该博文服用更佳:趣写算法系列之–匈牙利算法现在有N男N女,男生和女生每两个人之间有好感度,我们希望把他们两两配对,并且最后希望好感度和最大。 怎么选择最优的配对方法呢?首先,每个妹子会有一个期望值,就是与她有好感度的男生中最大的好感度。男生呢,期望值为0,就是,,,只要有一个妹子就可以啦,不挑~~这样,我们把每个人的期望值标出来。 然后,开转载 2016-10-29 20:28:17 · 738 阅读 · 0 评论 -
poj-1149-PIGS(最大流)
传送门这道题最麻烦的就是建图,详细的建图过程在 这里建完图就直接用dinic算法求最大流就行了#include <iostream> #include <cstdio>#include <cstring>#include <vector>#include <algorithm>#define N 1010const int INF = 0x3f3f3f3f;using namespac原创 2016-05-08 10:17:35 · 763 阅读 · 0 评论 -
如何判断一个点是否在一个多边形内部(转)
在多边性的存储中,每一个多边形都是由一系列连续的点组成,例如保存为数组Polygon[5],表示这个多边形是由5个点组成,这5个点顺序地存储在了数组Polygon之中。就如同走路一般地划线,从数组的第一个点连到第五个点,多边行就构造出来了。 在图形编程中,坐标的利用是不可忽视的。在这里判断一个点是否在多边行内部(可以包括线上)就要利用到各个点的坐标关系。下面开始讨论具体的方法。 对任何事物的分析转载 2015-11-28 11:21:54 · 1037 阅读 · 0 评论 -
Dinic算法的原理与构造(转)
为了更好的介绍Dinic算法,我们先来介绍最短增广路算法。最短增广路算法1、顶点的层次和层次网络顶点的层次:在残留网络中,把从源点到顶点u的最短路径长度(该长度仅仅是值路径上边的数目,与容量无关),称为顶点u的层次,记为level(u)。源点Vs的层次为0。将残留网络中所有的顶点的层次标注出来的过程称为分层。注意:(1)对残留网路进行分层后,弧可能有3种可能的情况。1、从第i层顶点指向第i+1层顶点转载 2016-05-01 19:05:34 · 5346 阅读 · 3 评论 -
hdu 1875 畅通工程再续
Problem Description相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现。现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组RPRush对百岛湖的情况充分了解后,决定在符合条件的小岛间建上桥,所谓符合条件,就是2个小岛之间的距离不能小于10米,也不能大于1000米。当然原创 2015-08-24 16:11:31 · 381 阅读 · 0 评论 -
poj 1258 Agri-Net
Farmer John has been elected mayor of his town! One of his campaign promises was to bring internet connectivity to all farms in the area. He needs your help, of course. Farmer John ordered a high spee原创 2015-08-24 16:27:40 · 286 阅读 · 0 评论 -
hdu 1102 Constructing Roads
http://acm.hdu.edu.cn/showproblem.php?pid=1102Problem DescriptionThere are N villages, which are numbered from 1 to N, and you should build some roads such that every two villages can connect to each o原创 2015-08-24 16:33:29 · 282 阅读 · 0 评论 -
uva 10034 - Freckles
In an episode of the Dick Van Dyke show, little Richie connects the freckles on his Dad’s back to form a picture of the Liberty Bell. Alas, one of the freckles turns out to be a scar, so his Ripley’s e原创 2015-08-24 16:39:51 · 605 阅读 · 0 评论 -
hdu 1233 还是畅通工程
http://acm.hdu.edu.cn/showproblem.php?pid=1233Problem Description某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。Input测试输入包含若干测试用例原创 2015-08-24 16:19:03 · 348 阅读 · 0 评论 -
UVa 10397 - Connect the Campus
Many new buildings are under construction on the campus of the University of Waterloo. The university has hired bricklayers, electricians, plumbers, and a computer programmer. A computer programmer? Ye原创 2015-08-24 16:47:38 · 812 阅读 · 0 评论 -
poj-1847-Tram(最短路问题)
传送门DescriptionTram network in Zagreb consists of a number of intersections and rails connecting some of them. In every intersection there is a switch pointing to the one of the rails going out of the i原创 2015-12-10 14:43:46 · 474 阅读 · 0 评论 -
HDU 1232 畅通工程
HDU 1232 畅通工程Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路? Input 测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1原创 2015-08-14 19:04:13 · 275 阅读 · 0 评论 -
poj 1860-Currency Exchange(Bellman_Ford算法)
传送门DescriptionSeveral currency exchange points are working in our city. Let us suppose that each point specializes in two particular currencies and performs exchange operations only with these currenci原创 2015-12-10 21:28:59 · 260 阅读 · 0 评论 -
POj 3259-Wormholes(Bellman-Ford算法)
传送门DescriptionWhile exploring his many farms, Farmer John has discovered a number of amazing wormholes. A wormhole is very peculiar because it is a one-way path that delivers you to its destination at原创 2015-12-10 20:10:25 · 332 阅读 · 0 评论 -
最短路径—Dijkstra算法和Floyd算法
Dijkstra算法1.定义概览Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。注意该算法要求图中不存在负权边。问题描述:在无向图 G=(V,E) 中,假设每条边 E[转载 2015-08-25 08:15:09 · 1358 阅读 · 0 评论 -
最小生成树-Prim算法和Kruskal算法
在一给定的无向图G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边(即),而 w(u, v) 代表此边的权重,若存在 T 为 E 的子集(即)且为无循环图,使得的 w(T) 最小,则此 T 为 G 的最小生成树。 最小生成树其实是最小权重生成树的简称。 Prim算法1.概览普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的转载 2015-08-24 15:46:17 · 770 阅读 · 0 评论 -
字典树(转)
又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。 字典树与字典很相似,当你要查一个单词是不是在字典树中,首先看单词的第一个字母是不是在字典的第一层,如果不在,说明字典树里没转载 2015-08-16 20:54:50 · 435 阅读 · 0 评论 -
最短路径算法—SPFA(Shortest Path Faster Algorithm)算法分析与实现(C/C++)
建议看SPFA前先看看Dijkstra和Bellman-Ford这两个最短路算法。SPFA的思路比较简单,网上的说法也比较统一,NOCOW和百度百科上都有。这里在网上找到讲的比较通俗易懂的:SPFA(Shortest Path Faster Algorithm) 是Bellman-Ford算法的一种队列实现,减少了不必要的冗余计算。 算法大致流程是用一个队列来进行维护。 初始时将源加入队列。 每转载 2015-08-25 16:21:52 · 2082 阅读 · 0 评论 -
树状数组
对于普通数组,其修改的时间复杂度位O(1),而求数组中某一段的数值和的时间复杂度为O(n),因此对于n的值过大的情况,普通数组的时间复杂度我们是接受不了的。 在此,我们引入了树状数组的数据结构,它能在O(logn)内对数组的值进行修改和查询某一段数值的和。 树状数组是一个查询和修改复杂度都为log(n)的数据结构,假设数组a[1..n],那么查询a[1]+…+a[n]的时间是log级别的,而且是转载 2016-01-26 08:08:38 · 455 阅读 · 0 评论 -
线段树 (转)
一:线段树基本概念1:概述 线段树,类似区间树,是一个完全二叉树,它在各个节点保存一条线段(数组中的一段子数组),主要用于高效解决连续区间的动态查询问题,由于二叉结构的特性,它基本能保持每个操作的复杂度为O(lgN)! 性质:父亲的区间是[a,b],(c=(a+b)/2)左儿子的区间是[a,c],右儿子的区间是[c+1,b],线段树需要的空间为数组大小的四倍 2:基本操作(demo用的是查询区转载 2016-01-25 11:46:16 · 466 阅读 · 0 评论 -
小Z的袜子(莫队算法)
试题来源 2010中国国家集训队命题答辩 问题描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿。终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的原创 2016-01-24 20:43:47 · 773 阅读 · 0 评论 -
用于求最近公共祖先(LCA)的 Tarjan算法–以POJ1986为例(转)
原文地址:https://comzyh.com/blog/archives/492/给定有向无环图(就是树,不一定有没有根),给定点U,V,找出点R,保证点R是U,V的公共祖先,且深度最深;或者理解为R离这两个点的距离之和最小.如何找出R呢?最一般的算法是DFS(DFS本是深度优先搜索,在这里姑且把深度优先遍历也叫做DFS,其实是一种不严谨的说法).先看一道赤裸裸的LCA:POJ 1330 Near转载 2016-10-30 21:11:27 · 865 阅读 · 1 评论