![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
图论
文章平均质量分 75
Think_Idea
水滴石穿
展开
-
最短路径Floyd算法讲解
如果需要求出每两点之间的最短路,不必调用n次Dijkstra(边权均为正)或者Bellman-ford(有负权)。有一种跟简单的实现算法-Floyd-Warshall算法代码如下:void Floyd(){ for(int k=1;k<=n;k++) for(int i=1;i<=n;++i) for(int j=1;j<=n;++j){原创 2015-08-12 15:26:26 · 2237 阅读 · 0 评论 -
hdu1827 Summer Holiday(tarjan+ 缩点)
题目链接:点击打开链接题意描述:听说lcy帮大家预定了新马泰7日游,Wiskey真是高兴的夜不能寐啊,他想着得快点把这消息告诉大家,虽然他手上有所有人的联系方式,但是一个一个联系过去实在太耗时间和电话费了。他知道其他人也有一些别人的联系方式,这样他可以通知其他人,再让其他人帮忙通知一下别人。你能帮Wiskey计算出至少要通知多少人,至少得花多少电话费就能让所有人都被通知到吗?原创 2015-09-15 23:09:42 · 373 阅读 · 0 评论 -
hdu3072 Intelligence System(tarjan缩点+最小树形图)
题目链接:点击打开链接题意描述:给了一个含有 n(0问,从给定的节点向其他所有的点通信,所花费的最小代价是多少?解题思路:tarjan缩点+最小树形图,总体时间复杂度O(N+M)分析:1、由于相互之间可以到达的点之间代价为0,所以我们可以对图中的环进行缩点,把环中的所有点视为一个点:时间复杂度O(N+M)2、然后问题就转换为求有向图的最小生成树问题,并且图中没有环:原创 2015-09-16 16:28:03 · 795 阅读 · 0 评论 -
最大团问题转载
一、定义 一个无向图 G=(V,E),V 是点集,E 是边集。取 V 的一个子集 U,若对于 U 中任意两个点 u 和 v,有边 (u,v)∈E,那么称 U 是 G 的一个完全子图。 U 是一个团当且仅当 U 不被包含在一个更大的完全子图中。G的最大团指的是定点数最多的一个团。 二、常用做法 1、顺序贪婪启发式搜索算法2、局部搜索启发式算转载 2015-09-17 16:02:15 · 326 阅读 · 0 评论 -
hdu3836 Equivalent Sets(有向图至少添加多少条边才能变为强连通图+tarjan缩点)
题目链接:点击打开链接题意描述:对于给定的有向图,至少要添加多少条边,才能使之成为强连通图解题思路:tarjan缩点+DAG性质1、DAG性质:对于一个有向无环图,若想让它成为强连通图,至少需要添加max(a,b) a为入度为0的边点的数量,b为出度为0的点的数量2、通过tarjan缩点将普通的有向图转换为有向无环图,注意当图本身就是强连通时(如只有1个点)时不需要添加边原创 2015-09-16 21:17:56 · 2110 阅读 · 0 评论 -
hihocoder 1223 : 不等式(最大团问题)
题目链接:点击打开链接题意描述:给出一些不等式,求最多可以满足多少不等式同时成立?解题思路:最大团问题分析:1、我们可以根据不等式之间的关系建图,如果两个不等式同时成立,则在这两个顶点之间建立一条边,问题转化为求这张图的最大团问题;2、由于规模n注意:1、x不一定是整数2、读字符时建议用字符串读入,去st[0]即可,这样可以解决很多换行问题尤其/n/r原创 2015-09-17 15:40:29 · 611 阅读 · 0 评论 -
hdu5258 wyh2000 and pupil(二分图染色)
题目意思:给出n个人和m个边,每条边表示这两个顶点的人不认识。问能否把所有人分为两组,要求组内人员相互认识(注意不同组的人可能认识,也可能不认识),并且每组不少于1个人。解题思路:二分图染色(ps:注意边界情况)#include #include #include #define MAXN 100010using namespace std;vector g[MAXN];i原创 2015-07-24 09:06:15 · 440 阅读 · 0 评论 -
poj2449 Remmarguts' Date(K短路:A*算法)
题目链接:点击打开链接题意描述:给定一张图,求从点s出发到点t的第k短路?解题思路:A*算法首先预处理使用Dijkstra求出从图中任意一点到点t的最短路径,然后使用A*算法求解即可A*算法中g为从出发点s到当前所走过的实际距离,h为从当前点到目标点t的最短距离,每次我们扩展g+h最小的点即可思考:本题我是用剪枝:记录一个maxdis表示第k短路的一个上界,使用原创 2015-10-25 11:39:23 · 437 阅读 · 0 评论 -
hdu5352 MZL's City(最小费用最大流问题)
题意描述:一个国家有N个城市,标号1~N,初始时城市和道路都被破坏,下面进行以下三个操作:第一种操作:1 X修建城市,和X(包括X自己也可以被修建)直接相连或间接相连的城市可以被一次性修建(但一次性最多修建k个城市)第二种操作:2 X Y 在X 与 Y之间建立一条道路第三种操作:3 p X1 Y1 X2 Y2 ···表示破坏X1与Y1、X2与Y2之间的道路经原创 2015-08-05 20:42:26 · 656 阅读 · 0 评论 -
hdu5418Victor and World(floyd算法+状压dp)
题目链接:点击打开链接题意描述:有n个城市,从1号城市出发经过所有的城市至少一次,然后再回到1号城市所花费最少的代价?解题思路:1、由于每个城市可以经过多次,所以我们先用floyd预处理一下图2、由于n的范围最大为16,所以考虑状压dp,我们可以把所有城市用一个长度为n的二进制表示,0表示未走过,1表示已经走过dp[k][i]:表示当前状态为k,以i为终点的路线,所以转移成为为原创 2015-08-23 11:43:55 · 783 阅读 · 0 评论 -
hdu5313 Bipartite Graph(二分图染色+dp+位运算)
题意描述:有一个n个点m条边的二分图,通过加边使得这张图变成一个边数最多的完全二分图. 最多能够新加多少条边. 注意重边是不允许的.解题思路:1、先对二分图染色(dfs),统计二分图中每个连通块(注意:这个二分图并不一定连通)中黑色和白色的数量(黑、白是相对的,不同连通块之间的黑、白没有联系);2、从每个连通块中选出黑或白的数量作为整个二分图中白色的那组,根据题目描述我们只原创 2015-07-26 17:08:47 · 903 阅读 · 0 评论 -
poj1034(二分图最大匹配)
题意:Bob和他的狗一起溜达,狗移动的速度是Bob的2倍。先给出Bob行走路线上的一些点,每次Bob从(x,y)走时狗可以离开他去玩耍或观赏一些景点,但要保证在Bob到达(x+1,y+1)时狗也达到了(x+1,y+1);同时给出了一些景点的坐标。求小狗狗最多可以经过多少的已给的点(即Bob路线上的所有点+小狗走的景点),并把小狗狗的行走路线打印出来思路:简单的二分图求最大匹原创 2015-05-28 21:46:03 · 754 阅读 · 0 评论 -
hihoCoder1121(二分图染色深搜、广搜对比)
///二分图染色问题#include #include #include #include using namespace std;const int MAX=10010;vector vc[MAX];int f[MAX];int n,m;bool dfs(int cn){ int len=vc[cn].size(); for(int i=0; i<len;原创 2015-05-31 00:14:19 · 776 阅读 · 0 评论 -
hdu5249 Tricks Device(网络流最大匹配)
分析题意可知:1、最少需要切断多少边使吴不能找到张(题意吴只能走最短路径上面的边),对从起点到终点的最短路径重新建图,每条边的权值为1,求最大流即可2、在吴可以找到张的前提下,最多可以切断边的数量:只需要在所有最短路径中寻找一条经过边数量最少的最短路径,用边的总数减去它即可(逆向思维)代码如下:#include #include #include #include #def原创 2015-07-23 10:10:59 · 624 阅读 · 0 评论 -
spfa算法
spfa算法:最短路径算法,适用于求解带有负权的图的最短路径,是BellmanFord的一种优化时间复杂度:O(kE),k为每个节点进入队列的次数,一般局限性:适用于稀疏图,同时不能输出负环(仅能检测负环,如果需要输出负环可使用BellmanFord算法),算法不稳定本质:宽度优先搜索+剪枝(将一个节点压入队列之前需要先判断这个节点是否已经在队列中)代码:int hea原创 2015-09-23 00:34:58 · 384 阅读 · 0 评论 -
hdu4009 Transfer water(最小树形图模板)
题目链接:点击打开链接题意描述:在一个村庄有n户人家(x,y,h),现在打算在村庄中挖井和建水渠使每户人家都可以用上水1、如果挖井费用为高度h*X;2、如果a->b建水渠,if(a.h>=b.h)费用为两点距离dis*Y,反之费用为dis*Y+Z问,怎样挖井和建水渠才能使费用最小?解体思路:最小树形图:点击打开链接分析:我们可以新建一个源点指向所有的用户,权值为挖井原创 2015-09-15 18:31:39 · 584 阅读 · 0 评论 -
hihocoder Hamiltonian Cycle(记忆化搜索+剪枝)
题目链接:点击打开链接题意描述:给定一个有向图,求图中哈密顿回路的数量。哈密顿回路,具体到本题中即从某一个点开始经过所有的点一次后再回到该点的不同路径数。对于这个不同需要注意两点:如果我们将路径经过的点按顺序写下,比如当n=3时,若存在123和231。此时,我们认为这两条路径是同一条哈密顿回路。而123和213则是不同的哈密顿回路。若两个点之间有多条边,经过不同原创 2015-09-14 16:19:21 · 548 阅读 · 0 评论 -
Uva821 Page Hopping(最短路径Floyd应用)
题目链接:点击打开链接解题思路:Floyd代码:#include #include #define INF 110using namespace std;int d[101][101];void Floyd(){ for(int k=1;k<=100;k++) for(int i=1;i<=100;++i) for(int j=原创 2015-08-12 15:29:59 · 875 阅读 · 0 评论 -
树的最小支配集,最小点覆盖与最大独立集 - smartyfh
首先看一下三者的定义:定义1 对于图G=(V,E)来说, 最小支配集 指的是从V中取尽量少的点组成一个集合,使得对于V中剩余的点都与取出来的点有边相连。也就是说,设V‘是图G的一个支配集,则对于图中的任意一个顶点u,要么属于集合V’,要么与V‘中的顶点相邻。在V’中出去任何元素后V‘不再是支配集,则支配集是极小支配集。称G的所有支配集中顶点个数最少的支配集为最小支配集,最小支配集中顶点的个转载 2015-08-26 14:43:10 · 679 阅读 · 0 评论 -
hdu1818 It's not a Bug, It's a Feature!(隐式图最短路径Dijkstra)
题目链接:点击打开链接题目描述:补丁在修bug时,有时也会引入新的bug,假设有n(n解题思路:首先思考动态规划是否可行?显然某个状态经过多次补丁修过之后可能会回到某一状态,并不是DAG,如果使用记忆化搜索会出现无限递归正确的做法:把每个状态看成结点,状态转移看成边,转化成图论中的最短路径问题,然后使用Dijkstra算法求解。不过这道题和普通的最短路径问题不一样:原创 2015-08-12 21:11:16 · 726 阅读 · 0 评论 -
图的点连通度边连通度总结
图的点连通度边连通度总结点连通度的定义:一个具有N个点的图G中,在去掉任意k-1个顶点后(1),所得的子图仍然连通,去掉K个顶点后不连通,则称G是K连通图,K称作图G的连通度,记作K(G)。独立轨:A,B是图G(有向无向均可)的两个顶点,我们称为从A到B的两两无公共内顶点的轨为独立轨,其最大的条数记作p(A,B)。在上图中有一个具有7个定点的连通图,从顶点1到顶点3有3条独立轨,即转载 2015-08-12 21:57:51 · 6846 阅读 · 0 评论 -
hdu5137 How Many Maos Does the Guanxi Worth(单源最短路径)
题目链接:点击打开链接题目描述:现在有一张关系网,网中有n个结点标号为1~n,有m个关系,每个关系之间有一个权值。问从2~n-1中任意去掉一个结点之后,从1~n的距离中所有最小值的最大值为多少?解题思路:多次调用Dijkstra即可,每次标记那个结点不通即可代码:#include #include #include #define MAXN 31#defin原创 2015-08-15 09:51:44 · 857 阅读 · 0 评论 -
hdu 4857/BestCoder Round#1 1001(拓扑排序+逆向建图)
此题需仔细分析题目,否则题意容易理解错误,应注意下面这种情况本题意思尽可能让最小的排的靠前,然后次小的尽量靠前,依次下去如input:13 13 1output:3 1 2解析:我们应让1尽可能的排在前面,然后尽可能的让2排的靠前。。。所以 2 3 1的结果是错误的思路:拓扑排序(逆向建图+队列)//为解决上述列子,如果我们正向建图,每次原创 2015-07-06 10:39:18 · 721 阅读 · 0 评论 -
握手定理
握手定理:有n个人握手,每人握手x次,握手总次数为S= nx/2。例:在宴会中,有10位嘉宾,每位嘉宾在宴会2次,宴会总共握手几次?解:根据 握手总次数S= nx/2,S=10注:每人握手次数即一个人在握手中总共其他人握手几次,由于握手是双向的,A与B握手,同时也是说B在与A握手,如果单纯计算是10*2=20次,而其中握手是由于双向重复的,实际握手次数需要除以2。顶点的度数与握手定转载 2015-08-18 09:32:29 · 7046 阅读 · 0 评论 -
hdu2454 Degree Sequence of Graph G(havel定理)
题目链接:点击打开链接题意描述:给定一个数组,数组元素代表无向图中某个点的度,问给定的序列能否构成简单图(不含平行边和自环)?解题思路:havel定理代码:#include #include #define MAXN 1010using namespace std;int n;int d[MAXN];bool cmp(int a,int b){ return a原创 2015-08-18 09:14:10 · 752 阅读 · 0 评论 -
hdu4081 Qin Shi Huang's National Road System(次小生成树模板)
代码:#include #include #include #include #define MAXN 1010#define INF 0x7fffffffusing namespace std;struct point{ int x,y,v;}p[MAXN];struct node{ int id;///节点标号 double dis; no原创 2015-09-09 00:53:04 · 447 阅读 · 0 评论 -
poj2728 Desert King(最优比率生成树)
题目链接:点击打开链接题意描述:在一个国家的城镇之间建水渠,把所有的城镇链接起来(n-1条边),两个城镇之间的长度为两点之间的直线距离,花费为两个城镇位置的高度之差。问花费之和/长度之和最小为多少?解题思路:最优比率生成树点击打开链接代码:#include #include #include #define MAXN 1010#define eps 1e-5#define原创 2015-09-06 00:58:40 · 328 阅读 · 0 评论 -
hdu4463 Outlets(必含某条边的最小生成树)
题目链接:点击打开链接题意描述:给定一些点,在这些点之间建边使所有的点联通,要求在必须包含某条边的前提下边的权值之和最小?解题思路:最小生成树问题prime(水题)分析:我们将p、q两点的最短距离设为0,然后将p、q压入优先权队列中进行prime即可,记得最后加上p->q的权值即可代码:#include #include #include #include #d原创 2015-09-10 19:50:31 · 1413 阅读 · 0 评论 -
hdu1596 find the safest road(最短路径floyd)
题目链接:点击打开链接题意描述:给定一张图,给出图中每条边的权值,求任意两点之间权值之积最大?解题思路:最短路径floyd求权之积:通过log可以转化为求权之和求最大:通过取加符号转化为求最小代码:#include #include #define MAXN 1010#define eps 1e-8using namespace std;const原创 2015-09-07 16:25:06 · 388 阅读 · 0 评论 -
hdu2433 Travel(最短路径dijkstra,好题)
题目链接:点击打开链接题意描述:给出边建图,然后分别删除各条边,问每一次删边后的所有端点的两两最短路之和,若有一对端点不连通,则返回INF解题思路:由于每条边的权值为1,所以此处我们可以对dijkstra进行优化,即使用bfs,从源点s出发,对于每一次更新过dis[i]之后直接压入队列即可超时代码:#include #include #include #def原创 2015-09-07 22:53:34 · 870 阅读 · 0 评论 -
hdu2647 Reward
题目链接:点击打开链接题意描述:在一个公司中,老板打算给员工发奖励,每个员工至少发888,但是员工之间奖励需要满足一些条件,如 a b代表a的奖励要比b至少多1,现在给定n个员工,和m的条件,问老板能否满足员工的要求(可能存在a比b多,同时b又比a多,此时无法满足),如果能够满足,老板至少需要准备多少?解题思路:1、我们可以根据条件建图,如果a比b多,则建一条b->a的有向边原创 2015-09-08 19:32:32 · 410 阅读 · 0 评论 -
最小生成树之Prime算法(基于优先队列)
#include #include #include #define MAXN 1010#define mem(a,b) memset(a,b,sizeof(a))using namespace std;/* * Prme算法:贪心,适用于稠密图 * 时间复杂度:O(NlogN+M)*/struct node{ int v,dist; node(int v,in原创 2015-09-24 00:14:00 · 976 阅读 · 0 评论