![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
图论
文章平均质量分 75
acraz
这个作者很懒,什么都没留下…
展开
-
tarjan算法之 边双连通分量
边双连通分量:对于一个无向图的子图,当删除其中任意一条边后,不改变图内点的连通性,这样的子图叫做边的双连通子图。而当子图的边数达到最大时,叫做边的双连通分量。我们要求边双连通分量,思路是把图中的所有桥都删去,然后剩下的每一个区域就是一个双连通分量具体做法还是利用tarjan算法,,我们要维护一个stack来统计出每一个双连通分量的所有结点#pragma warning(原创 2015-08-07 17:08:23 · 616 阅读 · 0 评论 -
POJ 1797 Heavy Transportation(dijkstra算法+优先队列优化)
题目就是找出从1到n的一条路径,使得这条路径的最小边权最大。dijkstra算法的变形,状态为终点V和到该点的最小边权的最大值M。#pragma warning(disable:4996)#include #include #include #include #include using namespace std;const int N = 1005;const int原创 2015-09-09 23:23:20 · 509 阅读 · 0 评论 -
通过POJ 3463 Sightseeing(dijkstra)彻底理解优先队列优化的dijkstra算法
先仔细梳理一下优先队列优化的dijkstra算法思路:我们要定义一个结构体,包含终点v,和从源点到终点v的最短路径长度dstruct node { int v, d; node(){} node(int v, int d) :v(v), d(d) {} //由于优先队列的特点重载<操作符,使得d最小的排在队列的front bool operator<(const node&op)原创 2015-09-09 17:43:54 · 399 阅读 · 0 评论 -
POJ 1201 Intervals(差分约束系统)
我们让xi表示[0,1,...,i-1]中选出数的个数,那么对于一行输入a,b,c,我们有x(b+1)-xa>=c。特别注意一下隐含条件:0(stl太慢了。。。慢的我都T了一次)#pragma warning(disable:4996)#include #include #include using namespace std;const int N = 50005;in原创 2015-09-08 22:33:37 · 309 阅读 · 0 评论 -
差分约束系统
简单介绍一下差分约束系统:对于形如x1-x2x1-x3x2-x3...构成的不等式组,我们要求出其中的一组解向量(x1,x2,x3,...,xn)使得所有的不等式都成立,我们就可以用最短路算法来解出其中的一个解向量,然后给每个xi同时加上一个常数k,所有不等式仍然成立(两个数同时加上常数k,这两个数的差值不变),然后就求出了解集。注意到在最短路中d[i]表示i到源点的最原创 2015-09-08 22:28:58 · 219 阅读 · 0 评论 -
5416 CRB and Tree
首先预处理出来所有节点到根节点的异或值,然后对于节点u,v,f(u,v)=f(u,1)^f(v,1)(由于异或的性质)然后我们可以对于每个询问s,枚举所有的v,对于每一个v查找有几个u,使得s^f(v,1)=f(u,1)至于查找u的时候,我们可以先预处理出来所有的f(u,1)的取值的个数,就是cnt[f(u,1)],然后直接访问cnt[s^f(v,1)]就成了。特别注意s=0,u=v时原创 2015-08-20 20:54:23 · 368 阅读 · 0 评论 -
POJ 2570 Fiber Network(Floyd+位运算)
都知道位运算对于集合的交并运算灰常简单。这道题要找到所有能从点u到点v的公司,那么我们如果有一个中间点k的话,从u到k的公司属于一个集合,从k到v的公司又属于一个集合,那么我们就会用到集合的取交集运算,所以这里我们使用的位运算。具体实现看代码。#pragma warning(disable:4996)#include #include #include using namesp原创 2015-09-11 11:56:41 · 277 阅读 · 0 评论 -
HDU 5433(Xiao Ming climbing)(费用最短路:BFS+优先队列)
昨天晚上比赛的时候被hack了,然后就wa到睡觉。。。wa的做法是每次只记录斗志允许情况下到达(x,y)的最短路,然后找到终点之后就是答案。错误的原因呢是因为poj上的一个费用最短路数据太水,让我给水过去了,没仔细考虑。一种特殊情况是:从源点S到一个点u,斗志k限制下的最短路为dis1,但是这个限制下不能从u到终点E。而从源点S到点u,斗志k限制下的另外一条路径为长度dis2(di原创 2015-09-13 21:51:20 · 514 阅读 · 0 评论 -
POJ 1724 ROADS(费用最短路:优先队列+BFS)
题目意思很简单,就是求费用最短路,数据比较小,考虑暴力bfs。状态定义为(花费,最短路,终点)的一个三元组。优先队列按照最短路长度排序,每次从队列里取出最短路长度最短的状态,然后把跟该状态终点相邻的点加入队列。因为数据比较小,所以不用记录访问情况也能ac。#pragma warning(disable:4996)#include #include #include #inclu原创 2015-09-09 12:34:42 · 382 阅读 · 0 评论 -
POJ 3259 Wormholes(SPFA算法判断负权回路)
SPFA算法中当某个顶点进入队列次数大于等于n的时候就说明存在负权回路了。恩就是这样。。。。#pragma warning(disable:4996)#include #include #include #include #include using namespace std;const int N = 505;vectorg[N], e[N];int cnt[N],原创 2015-09-16 19:15:31 · 418 阅读 · 0 评论 -
POJ 2395 Out of Hay(dijkstra变形)
题意是让求从1出发到点 u 所有路径上的最大边权的最小值。dijkstra变形一下就好了,用maxdis[i]数组来记录从1到点i的所有路径上最大边权的最小值,,那么就能像更新最短路一样更新这个题目的答案了,。还可以用kruskal算法来做,可能更简单一点。只想说POJ真坑,明明1w条边,开到1w+5就re,后来直接改成10w就ac了、#pragma warning(disable原创 2015-09-16 21:44:20 · 267 阅读 · 0 评论 -
POJ 2377 Bad Cowtractors(kruskal最大生成树)
题目就是求最大生成树,用kruskal算法乱搞一下就好了,要注意一下生成树不存在的时候要输出-1。。#pragma warning(disable:4996)#include #include #include using namespace std;struct edge { int from, to, cost; bool operator<(const edge &o原创 2015-09-16 22:01:28 · 275 阅读 · 0 评论 -
POJ 3268 Silver Cow Party(dijkstra最短路)
被别人机智的转置矩阵了一下给过了。。就是正着dijkstra之后,把边反向在求一次dijkstra#pragma warning(disable:4996)#include #include #include using namespace std;int n, m, x;int mp[1005][1005];int dis[1005], dis2[1005];bool原创 2015-09-16 20:14:39 · 254 阅读 · 0 评论 -
POJ 4045 Power Station(据说是:树形dp)
题目让从一棵树上找到一个节点,使得其它所有节点到该节点的距离之和最短。若存在不只一个这样的节点,按照节点编号从小到大输出。两次dfs就好了。#pragma warning(disable:4996)#include #include #include #include #include using namespace std;typedef long long LL;con原创 2015-09-18 19:56:45 · 345 阅读 · 0 评论 -
Aizu 2249 Road Construction(SPFA算法变形,好题)
另外开一个need数组记录一下需要的花费就好了,更新最短路的时候要分开:一种是更新最短路和花费,另一种是只更新花费。#pragma warning(disable:4996)#include #include #include #include using namespace std;const int N = 10005;const int M = N * 4;int fst原创 2015-09-20 09:43:57 · 422 阅读 · 0 评论 -
hdu 2586 How far away ?(LCA)
/**********************************************题意是给你一颗树,求树上任意两节点 u ,v 的距离**所求 u,v 的距离可以用最近公共祖先求得**设 x 为 u,v 的最近公共祖先,dis[i]为第 i 个结点到树根的距离**则所求为 dis[u]+dis[v]-2*dis[x];*****************************原创 2015-08-05 18:13:42 · 271 阅读 · 0 评论 -
LCA最近公共祖先的离线算法(Tarjan)和在线算法(ST)
最近公共祖先简称LCA(Lowest Common Ancestors),所谓LCA,是当给定一个有根树T时,对于任意两个结点u、v,找到一个离根最远的结点x,使得x同时是u和v的祖先,x 便是u、v的最近公共祖先。首先说一下小数据时的暴力求解: 简单粗暴的方法当然是你先将一个人的祖先全都标记出来,然后顺着另一个的父亲一直向上找,直到找到第一个被标记过的结点,便是它们的最近原创 2015-08-05 16:33:54 · 419 阅读 · 0 评论 -
tarjan算法之 强连通分量
#pragma warning(disable:4996)#include #include #include #include #include #define N 20001using namespace std;vectorto[N];int dfn[N], low[N], dfs_clock;bool vis[N], inStack[N];stacks;void原创 2015-08-07 23:57:01 · 208 阅读 · 0 评论 -
tarjan算法之 割边,割点
先介绍几个概念:1.割边:在连通图中,删除了连通图的某条边后,图不再连通。,这样的边叫做割边,也称作桥。2.割点:在连通图中,删除了连通图的某个点以及与这个点相连的边后,图不再连通。这样的点叫做割点。3.dfs搜索树:用 dfs 遍历图时,按照遍历次序的不同,我们可以得到一颗 dfs 搜索树。举个例子,对这个图一来说,其dfs搜索树便是图二图中还有几个概念树边:在搜原创 2015-08-07 16:07:44 · 498 阅读 · 0 评论 -
HDU 5418 Victor and World(状压dp、最短路)
首先用Folyd求出任意两点间的最短路。然后令dp[i][S]表示访问情况为S,最后访问i国家的最小花费。转移方程为dp[i][S|(1#pragma warning(disable:4996)#include #include #include using namespace std;int mp[17][17];int dp[17][1 << 16];//dp[i][原创 2015-08-26 15:07:34 · 349 阅读 · 0 评论 -
最短路算法之SPFA算法
SPFA(Shortest Path Faster Algorithm)算法自然有它的过人之处,它是BELLMAN-FORD算法的一种优化版本,一般认为算法复杂度为O(E)就好了 (其实我也不知道是O几)。算法思想就是把源点加入队列,然后从队列里不断取出队首,用队首相关的边去松弛,若能松弛,则把被松弛的边的另一个端点加入队列(若已经在队列里就不用加了),如此反复知道队列为空。vecto原创 2015-08-15 16:22:31 · 300 阅读 · 0 评论 -
最小生成树之prim算法
我不知道为什么prim算法跟最短路的dijkstra算法很像,很像很像。。。prim算法的思想也是维护两个集合,一个是源点集合,一个非源点集合,每次把非源点集合中的离源点集合最近的点加入源点集合(注意这里的“距离”跟dijkstra算法中的距离不同,这里的距离是指到源点集合中任意一点的距离,而dijkstra中距离是指到源点的距离),知道没有可加入的点,最小生成树就形成了。复杂度O(|V|原创 2015-08-15 16:51:12 · 188 阅读 · 0 评论 -
最短路算法之dijkstra
dijkstra算法处理非负边权有向图的最短路。时间复杂度为O(V^2)算法原理:假设与S相连的节点中离S最近的节点为T,并且距离为dist,那么不存在另外的路径使得从S到T的距离小于dist,于是就知道了S到T的最短路。然后把S和T当做一个节点即为tmp,那么与tmp相连节点中(即与S或T相连的节点中)距离tmp最近的节点设为u,就找到了tmp到u的最短路,也就是S到 u 的最短路。原创 2015-08-15 08:31:29 · 361 阅读 · 0 评论 -
hihocoder 1224 赛车 (我只能说LCA,T了)
先说一下我用LCA的思路:输入过程中把叶子结点找出来。然后dfs找出各个点到根节点1的距离,并且记录下最长路的长度len和非根节点端点tail,而且要求出来两个端点都是叶子结点的LCA。然后答案就是len+d[i]-d[lca(i,tail)](i为其它叶子结点)中的最大值了。下面是T了的代码o(╯□╰)o#pragma warning(disable:4996)#include原创 2015-08-30 22:16:25 · 419 阅读 · 0 评论 -
最短路算法之Folyd算法
看到hihocoder上面的解释不错就直接复制过来了。小Hi强行装作没听到,继续说道:“这个算法的核心之处在于数学归纳法——MinDistance(i, j)之间最短路径中可以用到的节点是一点点增加的!”“你这话每一个字我都听得懂,但是这句话为什么我听不懂呢……”小Ho无奈道。“那我这么说吧,首先,最开始的时候,MinDistance(i, j)——即从第i个点到第j个原创 2015-08-15 09:00:36 · 666 阅读 · 0 评论 -
POJ 1679 The Unique MST(次小生成树模板)
至于什么是次小生成树我就不说了主要是结论:次小生成树可由最小生成树换一条边得到。至于怎么换这一条边呢,首先换的这条边不能是最小生成树里面的,然后呢我们就假设我们给最小生成树加进去一条另外的边,那么现在最小生成树里就会有一个环,然后我们要做的就是把这个环除新加入边的其他边里边权最大的一条边去掉就成了一颗生成树了。。我们现在要做的就是把所有没在最小生成树里面的边全都枚举一遍然后找到次小生成树就原创 2015-08-16 23:24:32 · 449 阅读 · 0 评论 -
HDU 5423 Rikka with Tree(构造)
根据题意可以构造出来的特殊树有三种情况(全是以结点1为根节点),,第一种是一条直线,第二种是一条直线末尾开花,第三种是直接开花。如图所示。然后就可以知道对于每一个深度的点数为1,1,1,...,x,0,0,...。然后dfs一遍找一下就可以了。#pragma warning(disable:4996)#include #include #include #include us原创 2015-08-29 21:36:23 · 496 阅读 · 0 评论 -
最小生成树之kruskal算法
算法原理,,注意到边权最小的边肯定在最小生成树里所以我们只要把边排序后不断的找到当前图中最短的一条边,只要该边的两个顶点不属于同一个集合,我们就把边添加进来,然后合并两个集合,,直到找到最小生成树。简单一句话就是“边排序,并查集”。struct edge{ int u, v, c; bool operator<(const edge&op)const{ return c < o原创 2015-08-15 18:29:43 · 235 阅读 · 0 评论 -
UESTCoj 265 War(Floyd最短路)
WarTime Limit: 4000/2000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)Submit StatusYour country is now involved in a war! In the front, there are N positions be原创 2015-09-01 17:56:48 · 404 阅读 · 0 评论 -
HDU 5385 The path(构造)
贪心做法,一开始将11号点作为最短路径树的根,然后左边从22开始,右边从nn开始,只要之前加入的点有边连向他们就加入这样一个点加入的时间就是他的disdis值,最短路径树上的父亲也可以确定,于是输出时非树边长度为nn,树边长度为两个端点disdis之差#pragma warning(disable:4996)#include #include #include using原创 2015-08-17 16:08:16 · 572 阅读 · 0 评论 -
BNUOJ 13047 Greatest Parent(要说LCA有点勉强(。・∀・)ノ゙)
/***************************************题意是给你一棵树,树的每个结点都有一个 val 值**然后给你询问,每个询问两个数:u,v**让你找出所有结点 u 的祖先中 val 值大于或等于 v 的最大的祖先****思路就是 dfs 这棵树**维护一个栈,栈中保存着当前遍历结点的所有祖宗结点**具体维护手段就是每次遍历一个结点,把这个结点加入栈中原创 2015-08-05 21:11:10 · 223 阅读 · 0 评论 -
CF 一个不知道题号的题。。 B. ShortestPath Query
B. ShortestPath Querytime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputDe Prezer loves troyic paths.Consider原创 2015-09-21 22:16:10 · 430 阅读 · 0 评论