poj 1201 差分約束 spfa

2021-12-29 20:36:18 字數 1288 閱讀 5621

題意: 在區間[0,50000]上有一些整點,並且滿足n個約束條件(u, v, w),即在區間[u, v]上至少有x個整點,問區間[0, 50000]上至少有幾個整點。

思路:spfa(鄰接表)+差分約束。構造差分約束系統的關鍵:用dict[i]表示區間[0, i]上的整點數,則約束條件可化為dict[v] - dict[u-1] >= w,即dict[v] >= dict[u-1] + w,為spfa求最長路徑。另外還必須挖掘完整兩個隱含的約束條件,這也相當重要,即1 >= dict[i] - dict[i-1] >= 0,(dict[i] >= dict[i-1] + 0(正向邊)和 dict[i-1] - dict[i] >= -1 (反向邊)。因此區間[0, 50000]上至少有幾個整點即為dict[i]的最大值,即dict[max_num]的值。

在差分約束系統中如果題目要求是求最小值,就將約束條件轉化為">="形式,然後用bellman_ford演算法求解約束圖的最長路徑,如果題目要求的是最大值,就將約束條件轉化為"<="形式,然後用bellman_ford演算法求解約束圖的最短路徑.

**:[cpp] 

#include  

#define maxn 50005//最大邊條數 

#define inf 0x7fffffff//最大距離 

struct edge  

edge[4 * maxn];//邊集 

int dis[maxn]; 

bool vis[maxn]; 

int queue[10 * maxn]; 

int preedge[maxn];//同乙個頂點的前一條邊 

int edgenum,n,maxn; 

void addedge(int u, int v, int w)//新增一條邊   

void spfa()//spaf演算法 

queue[head] = 0; 

dis[0] = 0; 

while (head < tail) 

*/ } 

} } 

vis[u] = false; 

head ++; 

/*if (head == maxn)

*/ } }  

int main() 

addedge(u, v + 1, w); 

} for (int i = 0; i <= maxn; ++ i) 

spfa(); 

printf("%d\n", dis[maxn]); 

return 0; 

} 作者:zhang20072844

POJ1201 差分約束系統 SPFA實現

題目很簡單,用差分約束系統解決。假設si z與結合 1,i 的交集的元素的個數,則依題意有s b 1 s a c,還有隱含條件s i 1 s i 0 s i s i 1 1。然後求最短路徑或最長路徑,用bellman ford演算法解會超時,於是用spfa演算法解,288ms,還算快。可以通過spf...

poj 1201 差分約束

傳送門 題意 ai到bi間至少有ci個元素,問所有數中至少有多少元素。額。這樣好像說不清楚,我拿樣例說下吧。3到7之間至少有3個元素,8到10之間至少有3個元素,6到8之間至少有1個元素,1到3之間至少有1個元素,10到11之間至少有1個元素。最少情況如下 1 2 3 4 5 6 7 8 9 10 ...

差分約束(poj 1201

這裡簡要記一下差分約束。所謂差分約束,指的是由a b c這種不等式組組成的約束系統。一般的線性規劃問題可以用單純形法解決,但是這種特殊情況可以借助最短路演算法解決。記源點到v的最短路為d v 從u到v的最短路為d u,v 差分約束的最短路做法基於最短路的以下特點 對於沒有負圈的圖,任意兩點d u d...