題意: 在區間[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...