差分約束 原理其實很簡單

2021-06-23 01:38:36 字數 988 閱讀 4099

好文章就是讓初學者一看就知道原理和實現

一直不知道差分約束是什麼型別題目,最近在寫最短路問題就順帶看了下,原來就是給出一些形如x-y<=b不等式的約束,問你是否滿足有解的問題

好神奇的是這類問題竟然可以轉換成圖論裡的最短路徑問題,下面開始詳細介紹下

比如給出三個不等式,b-a<=k1,c-b<=k2,c-a<=k3,求出c-a的最大值,我們可以把a,b,c轉換成三個點,k1,k2,k3是邊上的權,如圖

由題我們可以得知,這個有向圖中,由題b-a<=k1,c-b<=k2,得出c-a<=k1+k2,因此比較k1+k2和k3的大小,求出最小的就是c-a的最大值了

根據以上的解法,我們可能會猜到求解過程實際就是求從a到c的最短路徑,沒錯的....簡單的說就是從a到c沿著某條路徑後把所有權值和k求出就是c -a<=k的乙個

推廣的不等式約束,既然這樣,滿足題目的肯定是最小的k,也就是從a到c最短距離...

理解了這裡之後,想做題還是比較有困難的,因為題目需要變形一下,不能單純的算..

首先以poj3159為例,這個比較簡單,就是給出兩個點的最大差,然後讓你求1到n的最大差,直接建圖後用bellman或者spfa就可以過了

稍微難點的就是poj1364,因為他給出的不等式不是x-y<=k形式,有時候是大於號,這樣需要我們去變形一下,並且給出的還是》,《沒有等於,都要變形

再有就是poj1201,他要求出的是最長距離,那就要把形式變換成x-y>=k的標準形式

注意點:

1. 如果要求最大值想辦法把每個不等式變為標準x-y<=k的形式,然後建立一條從y到x權值為k的邊,變得時候注意x-yx-y<=k-1

如果要求最小值的話,變為x-y>=k的標準形式,然後建立一條從y到x的k邊,求出最長路徑即可

2.如果權值為正,用dj,spfa,bellman都可以,如果為負不能用dj,並且需要判斷是否有負環,有的話就不存在

LINQ其實很簡單

會寫這一篇是有原因的,不只一次有人問我,要不要學 linq呢?linq 看起來很難耶 為何要放棄以前的 sql來學 linq呢?到底linq 的意義是什麼 反正就是有很多的問題,說真的,由於最近也沒時間寫本 linq 的書,但是工作累了順手寫寫 blog 還可以,所已針對 linq 這個主題,和大家...

LINQ其實很簡單

會寫這一篇是有原因的,不只一次有人問我,要不要學linq呢?linq看起來很難耶 為何要放棄以前的sql來學linq呢?到底linq的意義是什麼?反正就是有很多的問題,說真的,由於最近也沒時間寫本linq的書,但是工作累了順手寫寫blog還可以,所已針對linq這個主題,和大家有一些分享。其實對於v...

快樂其實很簡單

快樂,乙個簡單而不失文雅的詞語,可真正能體會到其中真諦的又有多少呢?我們來一起 下快樂的真諦吧!快樂,其實每個人對快樂的理解都不一樣,每個人能體會到的快樂程度也不一樣。比如 放假就會讓學生覺得很快樂,週末休息會讓忙碌了一周的上班族快樂,喜歡追星的人見到偶像很快樂等等,你會發現快樂就在我們身邊,快樂並...