題意:有$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 #include5bzoj2788using
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()
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在樹上暴力去跑的話,顯然時間肯定是接受不了的。因此我們需要考慮一種較為優美的...