#include#includeview code#include
using
namespace
std;
#define n 1000005
#define inf 999999999
inthead[n], vis[n], queue[n], dis[n], outqueue[n];
intn, index;
struct
edge
edge[n];
void add_edge(int u, int v, int
val)
void spfa(int
s) }}}
}int
main()
for(i=1; i<=maxn; i++)
n=maxn;
spfa(0);
printf(
"%d\n
", -1*dis[maxn]);
}return0;
}
題目大意:有乙個集合,給出n個關係,每組關係三個數a, b, c代表[a, b]區間最少c個數。求出集合中做少有多少個數字
解題思路:[差分約束] 1.我們首先要轉化成差分約束的特徵形勢x-y<=z的形勢。
2.我們設ti表示i之前的區間有多少個數。那麼tb-t(a-1)>=c ---(變形)--->t(a-1)-tb<=-c;
由於ti我們有合理的意義,那麼0=3.組合上面的條件,得到差分約束系統。建圖
4.用spfa演算法求解最短路
5.由於t(a-1)-tb<=-c,c加了負號, 因此得出的結果要從負數變為整數
**如下:
差分約束 poj 1201 Interval
差分約束 poj 1201 又是一道vector tle。確實很好的差分約束。很好的差分約束,注意隱含條件 0 d i 1 d i 1 題目保證了沒負圈。include include include using namespace std define n 50005 define inf 100...
POJ 1201 樹狀陣列
給你n個區間,每個區間為 a,b 每個區間取c個數構成乙個集合,求集合最小容量 把區間按b排序,從第乙個區間開始取,從後往前取,這樣盡可能和後面的區間重複 另外如果我們發現當前區間取得個數已經超過了c,那麼只需要讓之前區間換就行,而總數是不變的,所以不用更新答案 求當前區間已經取了多少個數用樹狀陣列...
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 ...