知識點 詳解 一 (點我)
簡單的 差分約束
如果是求解 d[st]-d[ed]的最大值 就要將所有的約束條件都轉化為 d[x]-d[y]<=z 的形式 然後建圖求最短路
如果是求解 d[st]-d[ed] 的最小值 就要將所有的約束條件轉戶為 d[x]-d[y]>=z 的形式,然後建圖,求最長路。
不等式標準化
如果給出的不等式有」<=」也有」>=」,又該如何解決呢?很明顯,首先需要關注最後的問題是什麼,如果需要求的是兩個變數差的最大值,那麼需要將所有不等式轉變成」<=」的形式,建圖後求最短路;相反,如果需要求的是兩個變數差的最小值,那麼需要將所有不等式轉化成」>=」,建圖後求最長路。
如果有形如:a - b = c 這樣的等式呢?我們可以將它轉化成以下兩個不等式:
a - b >= c (1)
a - b <= c (2)
再通過上面的方法將其中一種不等號反向,建圖即可。最後,如果這些變數都是整數域上的,那麼遇到a - b < c這樣的不帶等號的不等式,我們需要將它轉化成」<=」或者」>=」的形式,即 a - b <= c - 1
差分約束系統的解有三種情況:1、有解 (最短路(長路)能夠從起點到終點);2、無解(中間出現 圈的情況 );3、無限多解(圖不是連通:到不了終點);
差分約束 模版
(這只是我現在的理解,如有錯誤,歡迎指出 )
**
//** 求解 最短路型別的 差分約束
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define clr(a,b) memset((a),(b),sizeof(a))
#define inf 0x3f3f3f3f
#define mod 100009
#define ll long long
#define maxn 1000+10
#define maxm 2000000+100
#define ll o<<1
#define rr o<<1|1
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
using
namespace
std;
void read(int &x)
struct edge edge[maxm];
int head[maxn],top; //前向星存圖
int dis[maxn]; // 儲存距離
int qcnt[maxn]; // 記錄每個點入佇列的次數
int vis[maxn]; // 點是否在 佇列中
int n,m; // n個點
void addedge(int a,int b,int c)
; edge[top]=e;head[a]=top++;
} void init()
void getmap()
}int spfa(int st,int ed)
}}
if(dis[ed]!=inf) return
1; // 能夠到達終點 有解
else
return -1; // 圖不是連通的 無限個解
}int main()
差分約束知識點
什麼是差分約束 它旨在解決不等式組求最值的問題。就是給你一組不等式,詢問你某兩個變數之間的最大值or最小值 eg 給定n個變數和m個不等式,每個不等式形如 x i x j a k 1 i,j n,1 k m,a k 已知 求 x n x 1 的最大值 例 n 4,m 5 不等式組如下圖 我們可以兩兩...
POJ3169差分約束 SPFA 差分約束
思路 假設i j 兩隻奶牛可以站在同乙個位置,但是必須公升序排列,所以有差分約束方程d i d i 1 0 對於兩隻有好感的奶牛有差分約束方程d j d i k 對於兩隻反感的奶牛有差分約束方程d i d j k 有了約束方程就可以spfa include include include inclu...
分糖果 差分約束
description 幼兒園裡有n 個小朋友,lxhgww 老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。但是小朋友們也有嫉妒心,總是會提出一些要求,比如小明不希望小紅分到的糖果比他的多,於是在分配糖果的時候,lxhgww 需要滿足小朋友們的 k個要求。幼兒園的糖果總是有限的,l...