最短路徑之差分約束

2022-05-23 05:45:08 字數 2068 閱讀 3233

本文的目的是**最短路徑與差分約束之間的關係。為了方便理解,本文將從儲存圖的資料結構,最短路徑的演算法,以及最短路徑演算法和差分約束之間的相互轉換關係來討論。而基於最短路徑的有乙個著名的三角形不等式,即兩邊之和大於第三邊或者兩邊只差小於第三邊,a+b>c和a-b圖的儲存結構

工欲善其事必先利其器,為了更好的理解最短路徑,必須先了解儲存圖的資料結構。

一般而言,圖的儲存方式,有按節點儲存按邊儲存兩種方式。

/*

*a[i][j]代表的是以i為起點j為終點的邊的權值。

*一般而言的初始化是先讓要初始化的每個節點都為無窮大。然後再輸入。

*/int a[n][n];

/*

*鄰接表是為每個節點建立好邊的關係,將與每乙個定點連線的邊連成乙個鍊錶。

*在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())}}

}}

1.差分約束的定義

如若乙個系統由n個變數和m個不等式組成,並且這m個不等式對應的係數矩陣中每一行有且僅有乙個1和-1,其它的都為0,這樣的系統稱為差分約束( difference constraints )系統。

即可以化為:

x[i]-x[j]<=ak

x[c]-x[d]>=ak1

...x[n]-x[p]<=akn

也就是說,差分約束,就是一組不等式的集合。同時我們觀察,我們用來求最短路徑的方程,dist[u]> dist[v]+w,通過移項,可以看到,和差分約束的方程相同,實際上,我們可以把x[i]-x[j]<=ak看作是,從節點j指向節點i的一條邊為ak的有向圖。於是通過多個不等式的集合,我們可以相應的建出有向圖。例如下圖:

同時,我們可以從上面的介紹中看到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,使得所有條件...