從左邊不能到達右邊當且僅當存在一條與上下底邊相連的分割線將它們分開
設下底邊為s,上底邊為t,每個元件作為點,有公共部分的兩個點互相連邊
最後拆點求最小割
#include#include#includeusing namespace std;
const int n=620,inf=~0u>>2;
int n,i,j,x,y,s,t,h[n],gap[n],ans;
struct pa[n];
struct edge*g[n],*d[n];
inline void add(int s,int t,int f)
int sap(int v,int flow)
d[v]=g[v];
if(!(--gap[h[v]]))h[s]=t;
gap[++h[v]]++;
return rec;
}inline int sqr(int x)
inline double dis(int x1,int y1,int x2,int y2)
inline bool check(p a,p b)
if(a.t==1&&b.t==2)
int main()
for(i=1;i<=n;i++)if(check(a[i],a[0]))add(s,i,inf);
for(i=1;i<=n;i++)if(check(a[i],a[n+1]))add(i+n,t,inf);
for(gap[i=0]=t;i<=t;i++)d[i]=g[i];
while(h[s]return printf("%d",ans),0;
}
BZOJ 2764 JLOI2011 基因補全
題目 題意 給定乙個長度為n的鹼基序列s和乙個長度為m的鹼基序列t,現在希望向序列t裡補一定的鹼基使得序列s和序列t配對,配對的規則是a與t配對,c與g配對,新增鹼基的位置與數量不同的方案視為不同,求不同的方案數。0n 2000 題解 可以考慮算出序列t在序列s裡匹配的本質不同方案數,利用dp可以很...
BZOJ3192 JLOI2013 刪除物品
原題位址 自己想的奇葩做法 對於乙個優先順序為x的物品,考察該物品下方優先順序大於x物品的優先順序被分成了多少個連續段 舉個例子,如x 4,該物品下方物品的優先順序有5,6,7,9,10,13,14,19,則段數為4 則該物品需要被移動的次數k 段數 2 優先順序為x 1的物品在該物品下方?1 0 ...
bzoj4006 JLOI2015 管道連線
傳送門 思路 一眼看上去很像斯坦納樹 但是限制稍有不同,只要每種顏色的點聯通即可 也就是說最後可能是森林 我聽說裸寫斯坦納樹有90 所以我們要在外面再套一層dp f i j 還是斯坦納樹的狀態,i是以i為根,j是狀態為j 先用斯坦納樹求出每種聯通狀況的最小費用 再設dp i 表示i這個狀態的最小費用...