bzoj2788 festival 差分約束

2022-03-27 02:32:40 字數 1418 閱讀 6048

題意:有$n$個正整數$x1,x2,...,xn$,再給出$m1+m2$個限制條件,限制分為兩類:

1. 給出$a,b(1<=a,b<=n)$,要求滿足$xa + 1 = xb$

2. 給出$c,d (1<=c,d<=n)$,要求滿足$xc <= xd$

在滿足所有限制的條件下,求集合$$大小的最大值。

首先看情況我們也知道是差分約束……

但是這個差分約束有些不一樣在於這個東西會出環……所以我們要得出強連通分量……

得出來之後對於每個$scc$分別考慮就行了……

1 #include2 #include3 #include4 #include5

using

namespace

std;

6const

int maxn=605,maxm=200005;7

const

int inf=0x3f3f3f3f;8

intn,m1,m2,cnt,tot,scnt;

9int

head[maxn],map[maxn][maxn];

10int

dfn[maxn],low[maxn],belong[maxn];

11struct

node

12edge[maxm];

15void addedge(int u,int v,int

w)16

;head[u]=tot;18}

19 #include20 stacks;

21void tarjan(int

root)

2232

else

if(!belong[v])low[root]=min(low[root],dfn[v]);33}

34if(low[root]==dfn[root])

35while(k!=root);42}

43}44int

haha()

4556

for(int i=1;i<=m2;i++)

5761

for(int i=1;i<=n;i++)

62if(!dfn[i])tarjan(i);

63int ans=0;64

for(int b=1;b<=scnt;b++)

6580}81

}82for(int i=1;i<=n;i++)

8390

}91 ans+=ret+1;92

}93for(int i=1;i<=n;i++)

94if

(map[i][i])

9599 printf("

%d\n

",ans);

100}

101int sb=haha();

102int main()

bzoj2788

HDU4598 Difference(差分約束)

題意 有乙個圖,給圖上每個頂點都賦乙個實數ai。如果存在乙個正整數t滿足下面兩個條件,這個圖就是乙個 difference 1.ai t。2.如果點i,j構成的邊在圖中存在,則 ai aj t 否則 ai aj 代表充要條件 給出圖,問這個圖是否是乙個 difference 思路 結合前兩個條件,顯...

bzoj 3631 (樹上差分)

給你一棵有n n個結點的樹,現在給你乙個大小為n n的排列,說明你的行走路徑。你每經過樹上的每乙個點,你就需要將這個點的點權加1。問你最後所有點的點權大小。根據題目的意思,很明顯這道題是乙個非常典型的點差分的問題。我們只需要對結點uiu i vi vi 以及lca ui,vi l ca u i v ...

bzoj 4390(樹上差分)

給你一顆有n n個結點的樹以及m m個路徑。對於每乙個路徑pat hipa thi 代表著你將會從uiu i 走到vivi 現在問你,你走完著m m個路徑後,在這n n個結點中經過的最多的次數。首先,如果我們用dfs dfs在樹上暴力去跑的話,顯然時間肯定是接受不了的。因此我們需要考慮一種較為優美的...