差分約束 知識點

2021-08-01 14:25:57 字數 1765 閱讀 1340

知識點 詳解 一 (點我)

簡單的 差分約束

如果是求解 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...