LuoguP1231 教輔的組成

2021-08-15 15:38:48 字數 1535 閱讀 1156

題目鏈結

蒟蒻hansbug在一本語文書裡面發現了一本答案,然而他卻明明記得這書應該還包含乙份練習題。然而出現在他眼前的書多得數不勝數,其中有書,有答案,有練習冊。已知乙個完整的書冊均應該包含且僅包含一本書、一本練習冊和乙份答案,然而現在全都亂做了一團。許多書上面的字跡都已經模糊了,然而hansbug還是可以大致判斷這是一本書還是練習冊或答案,並且能夠大致知道一本書和答案以及一本書和練習冊的對應關係(即僅僅知道某書和某答案、某書和某練習冊有可能相對應,除此以外的均不可能對應)。既然如此,hansbug想知道在這樣的情況下,最多可能同時組合成多少個完整的書冊。

實質是個三分圖匹配(自己yy的) ,一道網路流模板題。

和二分圖匹配類似,但中間的圖要拆成兩個點,並連上容量為1的邊,保證中間的點不被匹配多次。

#include

#include

#include

#include

#include

#include

#include

#define set(a,b) memset(a,b,sizeof(a))

#define copy(a,b) memcpy(a,b,sizeof(a))

using

namespace

std;

inline

int read()

const

int m=1e6+20;

const

int inf=1e9;

const

int n=5e4;

struct edgea[m<<1];

int head[n];

int dis[n];

int cnt=0;

int cur[n];

int n,m,k;

int tot;

inline

void add(int x,int y,int z)

; head[x]=cnt++;

}queue

q;inline

void clear(queue

&q)

inline

bool bfs()

}return (dis[tot]!=-1);

}inline

int dfs(int u,int flow)

return flow-delta;

}inline

void dinic()

int main()

for(register

int i=1;i<=k;i++)

for(register

int i=1;i<=n;i++) add(i,i+n,1),add(i+n,i,0);

register

int x,y;

for(register

int i=1;i<=op;i++)

op=read();

for(register

int i=1;i<=op;i++)

dinic();

}

Luogu P1231 教輔的組成

有 text 本書 text 本練習冊 text 本答案,一本書只能和一本練習冊和一本答案配對。給你一些書和練習冊,書和答案的可能的配對關係。問你最多可以配成多少套完整的書冊。我已開始直接建立超級源點匯點,然後源點 rightarrow 練習冊連邊,練習冊 rightarrow 書連邊,書 righ...

P1231 教輔的組成

題目 啊,又是煩人的拆點,其實網路瘤一堆題都是拆點,本題顯然要把書,練習冊 53 答案 學生的福音 分開,但是,書作為中轉的地方,是具有唯一性的,不能2本53都配同一本書,這時我們還需要用拆點思想保障書是唯一的。code include include include include include...

落谷 P1231 教輔的組成

恩呃呃呃 給你a,b,c三類的物品,給出a,b b,c的匹配關係,乙個a,b,c類物品在一起就算一套物品。求出最多可以有多少套物品。最大流的問題,建立乙個超級源點和超級匯點,然後a b b c連邊,從源點跑一次網路流然後就可以求出答案了 include include include include...