差分約束筆記

學到差分約束。表示一點不懂。到處搜啊搜。

PS:我的博文是邊寫邊學的,其中很少刪改 - -。。(其實就是在做筆記麼。。這樣理解快些),如果想看結論就看最下面的。
       在“摘”後面的文章中有(*  *)標誌的爲筆記
===================================P1===begin============================================

什麼百科,文庫的看也看不懂。然後找到一篇博文,大概有點概念了。慢慢更新哈 - -
這篇博文地址:點擊打開鏈接
我就抄點過來唄。

摘:給出三個不等式,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的最大值了

筆記:因爲要求最大值,所以k3或第二條路徑k1+k2要最小呵= =。呀呵,難道就是比較k3和k1+k2哪個小?哪個小哪個的差就越大= =呵呵。。。

         額。。到底c-a這種哪個是起點哪個是終點阿= = 。。。    soga,因爲是c-a,所以一定是a到c(有向)的路徑(想起我們物理老師說的沒有你爸就

沒有你之類的話貌似就有點懂了。)就是一定有了一條路徑從a到c,纔能有c減去這個權值等於a(貌似是<=吧)


摘:根據以上的解法,我們可能會猜到求解過程實際就是求從a到c的最短路徑,沒錯的....簡單的說就是從a到c沿着某條路徑後把所有權值和k求出就是c-a<=k的一個
筆記:因爲要使得c-a<=k3的k3最小,且a到c的最短路加的是最小的權值,所以c-a就一定最大,即k3=d[c]-d[a],d是最短路。

筆記: 差分約束其實就是將所有的xi(1<=i<=n,n爲節點數,即上面的那種a呀,b呀,c呀)當成有向圖節點,根據權值構造個圖,然後xi就是d[i]
          (*後記:根據P2的說法,要建一個根開始掃,即增加一個源點s,s與所有定點相連,邊權均爲0*)
          用掃啊掃。SPFA, Bellman什麼的。求出最短路的就行了。

========================================end=============================================

===================================P2===begin============================================
P1說的貌似不是差分約束- - ,好像是最基礎的理解- -。。。其實樓上的有個概念含糊不清,就是那個c-a<=k3最小那裏。。

(摘爲百度百科:點擊打開鏈接

給出差分約束定義:
摘: 如果一個系統由n個變量和m個約束條件組成,其中每個約束條件形如xj-xi<=bk(i,j∈[1,n],k∈[1,m]),則稱其爲差分約束系統(system of difference constraints)。
       亦即,差分約束系統是求解關於一組變量的特殊不等式組的方法。

P1含糊不清的奇怪定義應該改爲:
        根據最短路的三角不等式定理:d[v]<=d[u]+w[u,v],移項,得d[v]-d[u]<=w[u,v]。(和差分約束的定義非常像)即差分約束
摘:  因此,以每個變量xi爲結點,對於約束條件xj-xi<=bk,連接一條邊(i,j),邊權爲bk(*即P1說的Ki*)。我們再增加一個源點s,s與所有定點相連,邊權均爲0。
        對這個圖,以s爲源點運行Bellman-ford算法(或SPFA算法),最終{d[i]}即爲一組可行解。

========================================end=============================================

===================================P3===begin============================================
呵呵呵呵呵呵------~~~~。。好像我懂了。。。大概總結一下:
建一個圖G,根爲S,d[S]=0;
然後S與每一個節點(即xi)連一條邊權爲0的邊。然後在x1到xn根據ki,i∈[1,n]來建邊,注意,因爲根據P2的移項前後,d[v]是在後面得到的,
故v爲終點,u爲起點,即如果有x1-x2<=k1,那麼建的邊應該是w[x2][x1] = k1;//起點是x2,終點是x1。然後掃啊掃~~。然後xi就是d[i]

========================================end=============================================


=====================================13.9.2更新============================================

自己用SPFA寫了代碼,呵呵= =

#include <iostream>
#include <queue>
#include <vector>
using namespace std;
const int MAXN = 1000;
const int INF = 1000000000;
//我習慣用這樣的鄰接表,呵呵
struct ed{int v, w;};
struct nod
{
	vector<ed> edge;
}node[MAXN];
int n, m, i, v, w, t;
int d[MAXN];
ed temp;
queue<int> q;
bool qvis[MAXN]={0};
int vis[MAXN]={0};

int main()
{
	cin >> n >> m; //n是X的數量,m是K的數量
	for(i = 0; i < m; i++)
	{
		cin >> temp.v >> t >> temp.w;
		node[t].edge.push_back(temp);
	}
        //初始化,順便初始化s節點
	for(i = 1; i <= n; i++)
	{
		temp.v = i, temp.w = 0;
		node[0].edge.push_back(temp);
		d[i] = INF;
	}
	d[0] = 0;
        //壓入s
	q.push(0);
        //SPFA
	while(!q.empty())
	{
		t = q.front(); q.pop();
		for(i = 0; i < node[t].edge.size(); i++)
		{
			v = node[t].edge[i].v;
			w = node[t].edge[i].w;
			if(d[v] > d[t] + w)
			{
				d[v] = d[t] + w;
				if(!qvis[v])
				{
					qvis[v] = 1;
					q.push(v);
					vis[v]++;
				}
				if(vis[v] > n)
				{
					cout << "No answer!\n";
					while(!q.empty())q.pop();
					break;
				}
			}
		}
		qvis[t] = 0;
	}
	for(i = 1; i <= n; i++)
		cout<<'x'<<i<<':'<<d[i]<<endl;

	return 0;
}


========================================end=============================================


====================================13.10.24更新===========================================

摘自NOCOW(點擊打開鏈接):

如果一個系統由n個變量和m個約束條件組成,其中每個約束條件形如xj-xi<=bk(i,j∈[1,n],k∈[1,m]),則其爲差分約束系統(system of difference constraints)。亦即,差分約束系統是關於一組變量的特殊不等式組。求解差分約束系統,可以轉化成圖論的單源最短路徑問題。

觀察xj-xi<=bk,會發現它類似最短路中的三角不等式d[v]<=d[u]+w[u,v],即d[v]-d[u]&lt;=w[u,v]。因此,以每個變量xi爲結點,對於約束條件xj-xi<=bk,連接一條邊(i,j),邊權爲bk。我們再增加一個源點s,s與所有點相連,邊權均爲0。對這個圖,以s爲源點運行bellman-ford算法,最終{d[i]}即爲一組可行解。(差分約束系統的解的一個特點是,當將所有變量同時增加相同的大小,約束條件依然成立)

========================================end=============================================


發佈了40 篇原創文章 · 獲贊 2 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章