本文的目的是**最短路徑與差分約束之間的關係。為了方便理解,本文將從儲存圖的資料結構,最短路徑的演算法,以及最短路徑演算法和差分約束之間的相互轉換關係來討論。而基於最短路徑的有乙個著名的三角形不等式,即兩邊之和大於第三邊或者兩邊只差小於第三邊,a+b>c和a-b圖的儲存結構也就是說,差分約束,就是一組不等式的集合。同時我們觀察,我們用來求最短路徑的方程,dist[u]> dist[v]+w,通過移項,可以看到,和差分約束的方程相同,實際上,我們可以把x[i]-x[j]<=ak看作是,從節點j指向節點i的一條邊為ak的有向圖。於是通過多個不等式的集合,我們可以相應的建出有向圖。例如下圖:工欲善其事必先利其器,為了更好的理解最短路徑,必須先了解儲存圖的資料結構。
一般而言,圖的儲存方式,有按節點儲存按邊儲存兩種方式。
/*
*a[i][j]代表的是以i為起點j為終點的邊的權值。
*一般而言的初始化是先讓要初始化的每個節點都為無窮大。然後再輸入。
*/int a[n][n];
1.差分約束的定義/*
*鄰接表是為每個節點建立好邊的關係,將與每乙個定點連線的邊連成乙個鍊錶。
*在c++中,有為我們封裝好的list鍊錶,可以直接使用。**/
listli[n];
/**前向星也是按邊儲存,通過構造結構體節點,儲存每一條邊的開始節點,終止節點,和邊權值。
*再將所有節點陣列按照開始節點的大小進行排序,就可以達到連續訪問從一起點出發的邊。
*但同時缺點也明顯,需要進行一次排序,開銷也比較大。
*/struct edge
edge(int _u,int _v,int _w)
}edge eg[n];
bool cmp(edge a,edge b)
node(int _id,int _value)
bool operator < (const node &a)const
}struct edge
edge(int _u,int _v,int _w)
}vectoreg[n];//儲存邊,利用vector實現鏈式前向星。
bool vis[n];//該節點是否已經屬於擴充套件過的,是就是true,否就是false。
int pre[n],dist[n];//pre[i]儲存到i的上乙個節點,dist[i]儲存源點到i的當前最短距離。
void dijkstra(int s)}}
}void init()
node(int _id,int _value)
bool operator < (const node &a)const
}struct edge
edge(int _u,int _v,int _w)
}bool inq[n];//標記定點是否在佇列中,true表示在,flase表示不在
vectoreg[n];//用vector來模擬鏈式前向星,或者說鄰接表
int dist[n],visitcount[n];//dist[i]記錄從源點到i的當前最短距離,visitcount[i]表示i節點被訪問的次數;
void spfa(int s,int n)
priority_queueque;
que.push(node(s,0));
inq[s]=1;
while(!que.empty())}}
}}
如若乙個系統由n個變數和m個不等式組成,並且這m個不等式對應的係數矩陣中每一行有且僅有乙個1和-1,其它的都為0,這樣的系統稱為差分約束( difference constraints )系統。
即可以化為:
x[i]-x[j]<=ak
x[c]-x[d]>=ak1
...x[n]-x[p]<=akn
同時,我們可以從上面的介紹中看到x[i]-x[j]<=ak,x[i]-x[j]>=ak都是從i到j的一條邊,邊值是ak,但是有什麼區別嗎?
2018 08 07 最短路徑 差分約束
在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n表示成都的大...
K Candies 差分約束 最短路)
有n個孩子,m個關係 關係分別有3個數u,v,w。代表v的糖果數不能多於u w個,也就是dis v dis u w 這就轉換成 if dis v dis u w dis v dis u w.1 spfa stack include include include include includecon...
差分約束系統 最短路徑演算法的應用
差分約束系統是一種特殊的n元一次不等式組,它包含n個變數x1 xn以及m個約束條件,每個約束條件都是由兩個變數做差構成,形如xi xj ck,其中ck是常數 可以是負數也可以是非負數 1 i,j n,1 k m.我們要解決的問題是求一組解,x1 a1,x2 a2,x3 a3,xn an,使得所有條件...