2018/2/10 每日一学 差分约束算法

差分约束算法

我们知道,对于一个最短路问题中的某边<u,v>,必定有d[v]<=d[u]+w,稍稍变形可得d[v]-d[u]<=w,是不是很像x1-x2<=a这种数学不等式?

所以对于一不等式组,我们可以将其转化为x1-x2<=a形式,连接一条有向边(X2->X1),权值为a,然后求最短路就行了。

注意如果对于负环的判断以及图的连通判断……

刷点题再看看吧。

原文地址:https://www.cnblogs.com/Alex-leaves/p/8439751.html

时间: 2024-08-24 13:27:55

2018/2/10 每日一学 差分约束算法的相关文章

2018/03/10 每日一学PHP 之 修饰符 public/private/protected

对于面向对象 修饰符的使用是我们最常用,也是很容易忽略的小细节. 对于编程来说,把握好每一个小细节,就能构造出漂亮,优雅的程序. public 使用最多的修饰符,公共方法,允许所有访问,就像一个公交车一样,上来交钱[参数],有钱就行,无所谓是谁. 对于这个修饰符救不在做更多的解释了,因为他的使用实在是太多了. PS:如果一个方法没有定义修饰符,那么在PHP5中,默认是public. private 私有方法, 不允许在直接实例化后访问,子类也不能直接访问,只允许在自己的类中使用. 道理我都懂,我

差分约束算法总结

来自 https://blog.csdn.net/my_sunshine26/article/details/72849441 差分约束系统 一.概念 如果一个系统由n个变量和m个约束条件组成,形成m个形如ai-aj≤k的不等式(i,j∈[1,n],k为常数),则称其为差分约束系统. 二.引例 给定n个变量和m个不等式,每个不等式的形式为 x[i] - x[j] <= a[k] (0 <= i, j < n, 0 <= k < m, a[k]已知),求 x[i] - x[j]

2018/03/10 每日一个Linux命令 之 cksum

每日一个Linux命令 2018-03-10 Linux 命令 cksum cksum [文件]  今天楼下的一个大妈去世了,不仅感叹,现如今,真的和以前不一样了,楼上楼下都不知道住的是谁? cksum命令用于检查文件的CRC是否正确.确保文件从一个系统传输到另一个系统的过程中不被损坏. CRC是一种排错检查方式,该校验法的标准由CCITT所指定,至少可检测到99.998%的已知错误. 说明已经很清楚了,这个命令的作用也就是检查文件的相同性,在于MD5和HASH的选择上,使用哪种方法,到时候就看

2018/2/11 每日一学 无向图割顶和桥

割顶和桥:对于无向图G,如果删除某个节点u后,连通分量数目增加,则称u为图的割顶:如果删除某条边后,连通分量数目增加,则称该边为图的桥. 对于连通图删除割顶或桥后都会使得图不再连通. 我们利用dfs的性质来快速找出一个连通图中的所有的割顶和桥. 设low[u]为u及其后代所能连回的最早的祖先的pre[]值,pre[]为时间戳则当u存在一个子节点v使得low[v] >= pre[u]时u就为割顶 同理当 low[v] > pre[u]时 u-v为桥 看代码吧(转自http://blog.csdn

2018/2/12 每日一学 三分搜索

对于二分,设left,right为问题的两个极值,用min=left+(right-left)>>1或mid=(left+right)>>1,可以知道mid值,判断,然后进行更换. 显然,二分适用于单调函数,而对于一个二次函数就无效了. 这时,我们可以用三分搜索来做. 我们定义midl=(left+mid)>>1,midr=(right+mid)>>1.判断midl和midr就行了. 看看代码吧:(转自http://blog.csdn.net/u011787

2018/2/16 每日一学 A*搜索

A*搜索 我们知道dfs和bfs在搜索中会搜素一些完全不会搜的点,这是因为,他们只考虑到起点到当前点的作用,未考虑到终点. 我们不妨设f[i]=g[i]+h[i],其中g[i]为到i的最短路(已知),h[i]为i到终点的估计值.所以说,我们用f[i]做bfs 每次取出f最小的i,拓展,然后直到终点-- 那么h[i]怎么求?? 我们可以用曼哈顿距离或者欧式距离等等来表示,注意我们要用二叉堆来维护f数组. 代码目前网上很多,就不写了. 原文地址:https://www.cnblogs.com/Ale

2018/2/17 每日一学 RMQ

什么是RMQ? 给予n个数,对于区间[l,r]查询最小.最大值. 这就是RMQ. 怎么做? 我们不妨设f[i][j]表示从i开始的2^j个数极值. 显然,他表示的是[i,i+2^j-1],注意有-1(想想,为什么?) 那么我们不难得到递推式:f[i][j]=min/max(f[i][j-1]+f[i+1<<(j-1)+1][j-1]. 注意先枚举j,联系以下区间dp不难明白为什么先枚举j. 最后怎么查询??? 很简单,分治的思想. 假设我们查询[x,y],则ans=max/min([x][k]

2018/2/22 每日一学 AC自动机

AC自动机=trie树+KMP. 代码如下:(自行理解) #include<cstdio> #include<string.h> #include<math.h> #include<queue> #include<algorithm> #define N 500006 using namespace std; char st[1000005]; char keyword[55]; int n,m; int next[N][26],cnt[N],f

2018/2/24 每日一学 字符串最小表示法

非常简单,直接上代码: int minimalRepresentation() { int n = strlen(str); int i = 0,j = 1, k = 0; while(i<n && j<n && k<n) { int t = str[(i+k)%n] - str[(j+k)%n] ; if(t == 0) k++; else { if(t>0) i+=k+1; else j+=k+1; if(i==j) j++; k = 0; }