題目戳我
\(\text\)
顯然是乙個類似於二分圖,實際上卻有三部分的圖的「最大匹配」。
顯然,我們可以想到書向練習冊,練習冊向答案的建圖方式。但這樣顯然是錯的。因為每冊練習冊被用到了多次。
鑑於題目中給出的是書向某物的關係,我們就讓書當作圖中最中間的一排點。即 練習冊\(\to\)書\(\to\)答案。
為了保證書只用一次,我們要對書進行拆點。即,將書分成兩種點:入點和出點,練習冊連入點,出點連答案,入點向出點連一條容量是\(1\)的有向邊。
這樣可以保證每一本書一定最多被用了一次。
剩下的考慮如何建立超級源點和超級匯點。顯然,每一冊練習冊向源點連容量為\(1\)的邊\((s\to practice),\)答案向匯點連容量為\(1\)的邊\((answer\to t).\)
筆者第一次交的時候因為忽略的最後一步限制答案的邊容量導致答案錯誤,值得反思。
#includeusing namespace std;
const int maxn=2e5+10;
int head[maxn],tot=1,n1,n2,s,t;
int n3,m1,m2,dep[maxn],cur[maxn];
const int inf=(1<<30);
struct edgee[maxn];
inline void add(int x,int y,int w)
bool bfs(int s,int t)
} }return false;
}int dfs(int s,int flow,int t)
} return flow-rest;
}int dinic(int s,int t)
int main()
scanf("%d",&m2);
for(int i=1;i<=m2;++i)
s=t+n1+n2+n3+n1+2,t=n1+n2+n3+n1+1;
for(int i=1;i<=n2;++i)add(s,i+n1,1);
for(int i=1;i<=n3;++i)add(i+n1+n2,t,1);//!
printf("%d\n",dinic(s,t));
return 0;
}
教輔的組成
滾粗了的hansbug在收拾舊語文書,然而他發現了什麼奇妙的東西。蒟蒻hansbug在一本語文書裡面發現了一本答案,然而他卻明明記得這書應該還包含乙份練習題。然而出現在他眼前的書多得數不勝數,其中有書,有答案,有練習冊。已知乙個完整的書冊均應該包含且僅包含一本書 一本練習冊和乙份答案,然而現在全都亂...
LuoguP1231 教輔的組成
題目鏈結 蒟蒻hansbug在一本語文書裡面發現了一本答案,然而他卻明明記得這書應該還包含乙份練習題。然而出現在他眼前的書多得數不勝數,其中有書,有答案,有練習冊。已知乙個完整的書冊均應該包含且僅包含一本書 一本練習冊和乙份答案,然而現在全都亂做了一團。許多書上面的字跡都已經模糊了,然而hansbu...
P1231 教輔的組成
題目 啊,又是煩人的拆點,其實網路瘤一堆題都是拆點,本題顯然要把書,練習冊 53 答案 學生的福音 分開,但是,書作為中轉的地方,是具有唯一性的,不能2本53都配同一本書,這時我們還需要用拆點思想保障書是唯一的。code include include include include include...