與zoj2770乙個建模方式,字首和當作點。
對於每個區間[a,b]有這麼個條件,sa-sb-1>=c,然後我就那樣連邊wa了好幾次。
後來偷看資料才想到這題還有兩個隱藏的約束條件。
這題字首和表示的是區間內點存在的個數,因此:
si>=si-1
si-si-1
<=1
所以,差分約束系統的構圖一定要考慮全面。
1 #include2 #include3 #include4 #include5using
namespace
std;
6#define maxn 65555
7#define maxm 411111
8#define inf (1<<30)910
struct
edgeedge[maxm];
13int
head[maxn],ne,nv,vs;
14void addedge(int u,int v,int
cost)
1819
intd[maxn];
20bool
vis[maxn];
21void
spfa()
25 vis[vs]=1; d[vs]=0
;26 queueque;
27que.push(vs);
28while(!que.empty())38}
39}40 vis[u]=0;41
}42}43
intmain()
55 vs=maxu+1; nv=vs+1;56
for(int i=1; i<=maxu; ++i) addedge(i-1,i,1
);57
for(int i=1; i<=maxu; ++i) addedge(i,i-1,0
);58
for(int i=0; i<=maxu; ++i) addedge(vs,i,0
);59
spfa();
60int res=inf;
61for(int i=0; i<=maxu; ++i) res=min(res,d[i]);
62 printf("
%d\n
",-res);63}
64return0;
65 }
差分約束 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 ...